C++程序中DLT Debug日志在dlt-viewer无法显示问题求助
DLT Debug日志无法显示,点击「Connect all ECUs」后恢复的原因分析
问题描述
自研C++程序使用DLT日志框架,输出Info和Debug级别的日志,但dlt-viewer初始仅显示Info日志。已将dlt-viewer日志级别设为Verbose,修改dlt-daemon的dlt.conf配置文件,设置LoggingLevel=7(Debug)、ContextLogLevel=5(Debug)后问题依旧,点击dlt-viewer的「Connect all ECUs」按钮后就能正常看到Debug日志。
相关代码如下:
main.cpp
#include <dlt/dlt.h> #include <csignal> #include "DltLoggerManager.h" #include "./others_classes/FooClass.h" #include <chrono> void signalHandler(int signal) { // 处理信号,例如清理并刷新日志 // 终止应用 std::exit(signal); } int main() { DltLogger *logger = new DltLogger(); std::this_thread::sleep_for(std::chrono::seconds(1)); if(logger) { logger->logInfo("main", "test begin"); logger->logDebug("main", "test debug "); } // 收到关闭信号时调用signalHandler std::signal(SIGINT, signalHandler); std::signal(SIGTERM, signalHandler); return 0; }
DltLogger日志写入函数
void DltLogger::logDebug(const std::string &name_function, const std::string &message) { std::string msg = name_function + ". " + message; if (is_context_registered_) { DLT_LOG(context_, DLT_LOG_DEBUG, DLT_CSTRING(msg.c_str())); } } void DltLogger::logInfo(const std::string &name_function, const std::string &message) { if (is_context_registered_) { std::string msg = name_function + ". " + message; DLT_LOG(context_, DLT_LOG_INFO, DLT_CSTRING(msg.c_str())); } }
核心原因
这个现象的本质是dlt-daemon默认不会主动推送低级别日志(如Debug)给已连接的客户端,直到客户端发送「日志级别同步」指令:
- dlt-viewer启动后初始连接时,仅会建立基础通信,不会主动向dlt-daemon发送「启用Debug级别日志」的请求,此时daemon仍按默认的较高级别限制推送日志;
- 点击「Connect all ECUs」按钮时,dlt-viewer会向dlt-daemon发送动态日志级别调整指令,将客户端设置的Verbose级别同步到daemon端,触发daemon更新对应上下文的日志输出策略,之后Debug日志就能正常推送;
- 若修改
dlt.conf后未重启dlt-daemon,静态配置不会覆盖daemon的运行时动态级别设置,导致修改无效。
解决方法
- 确保dlt-daemon配置生效:修改
dlt.conf后,重启dlt-daemon服务(例如执行systemctl restart dlt-daemon),让静态配置加载生效; - 在程序中强制设置日志级别:在DltLogger完成上下文注册后,调用
DLT_SET_LOG_LEVEL(context_, DLT_LOG_DEBUG),强制指定当前上下文的日志级别,不受daemon默认配置限制; - 调整dlt-viewer默认行为:在dlt-viewer的设置中开启「连接时自动同步日志级别」选项,避免每次手动点击「Connect all ECUs」。
内容的提问来源于stack exchange,提问作者Monetillo
相关产品推荐
相关产品推荐

