You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:31:16