Skip to content

fix(logging): add Qt logging filter rules initialization#475

Open
add-uos wants to merge 1 commit into
linuxdeepin:masterfrom
add-uos:fix-348319-add-logging-filter-rules
Open

fix(logging): add Qt logging filter rules initialization#475
add-uos wants to merge 1 commit into
linuxdeepin:masterfrom
add-uos:fix-348319-add-logging-filter-rules

Conversation

@add-uos

@add-uos add-uos commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Add initLoggingRules() to read QT_LOGGING_RULES environment variable for log filtering. Default to disabling debug logs when unset.

添加 Qt 日志过滤规则初始化,通过 QT_LOGGING_RULES 环境变量控制日志输出,
未设置时默认关闭 debug 日志。

Log: 添加 Qt 日志过滤规则初始化功能
PMS: https://pms.uniontech.com/bug-view-348319.html
Influence: 应用启动时可通过环境变量控制日志级别,默认关闭 debug 日志减少输出噪音。

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @add-uos, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

Add initLoggingRules() to read QT_LOGGING_RULES environment variable
for log filtering. Default to disabling debug logs when unset.

添加 Qt 日志过滤规则初始化,通过 QT_LOGGING_RULES 环境变量控制日志输出,
未设置时默认关闭 debug 日志。

Log: 添加 Qt 日志过滤规则初始化功能
PMS: https://pms.uniontech.com/bug-view-348319.html
Influence: 应用启动时可通过环境变量控制日志级别,默认关闭 debug 日志减少输出噪音。
@add-uos add-uos force-pushed the fix-348319-add-logging-filter-rules branch from 5c531ec to 56ac722 Compare June 10, 2026 02:51
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

你好!我是CodeGeeX,你的智能编程助手。我已仔细审查了你提供的 Git Diff 代码。

这段代码的主要目的是在应用程序启动时初始化 Qt 的日志过滤规则,默认关闭所有 debug 级别的日志,除非用户通过环境变量 QT_LOGGING_RULES 进行了覆盖。

以下是我从语法逻辑、代码质量、代码性能和代码安全四个维度提出的审查意见和改进建议:

1. 语法与逻辑

  • 逻辑冲突:代码在 initLoggingRules() 中默认设置了 *.debug=false,意在屏蔽 debug 日志。然而,在 main 函数中,紧接着就调用了 qDebug() << "Application starting with arguments:" << ...。由于此时 debug 日志已被默认屏蔽,这行日志在默认情况下永远不会被输出。这属于明显的逻辑矛盾。
    • 建议:如果这行启动日志是必须的,应考虑将其改为 qInfo();或者修改默认日志规则,允许特定模块输出 debug 日志(例如 default.debug=false,然后在特定模块单独开启)。
  • 环境变量优先级逻辑:当前逻辑是“如果环境变量为空,则使用默认值”。这符合 Qt 的常见用法,逻辑正确。

2. 代码质量

  • 硬编码字符串DEFAULT_LOGGING_RULES 被声明为 static const char *,在 C++ 中,更推荐使用 constexprconst std::string / const QString,以获得更好的类型安全性和与 Qt API的一致性。
  • 日志规则的可维护性:将 *.debug=false 硬编码在源码中,使得调试时必须重启程序并修改环境变量。可以考虑增加命令行参数(如 --verbose)来动态覆盖日志规则,提升开发体验。
  • PerformanceMonitor::initializeAppStart() 的位置:在 main 函数中,initLoggingRules() 被放在了最前面,这是好的。但 QCoreApplication (或 QApplication) 的创建似乎在 diff 中没有展示。需要注意,QCoreApplication::arguments() 必须在 QCoreApplication 实例创建之后才能调用。如果当前代码在创建 QCoreApplication 之前调用了 arguments(),会导致未定义行为或崩溃。

3. 代码性能

  • 启动时性能qgetenvQLoggingCategory::setFilterRules 都是非常轻量级的操作,在 main 函数开头调用一次,对启动性能的影响可以忽略不计,当前实现没有明显的性能瓶颈。

4. 代码安全

  • 环境变量注入qgetenv("QT_LOGGING_RULES") 读取环境变量是安全的,因为 Qt 内部会正确处理编码和空值。但需要注意,如果程序以特权身份运行(如 SUID root),环境变量可能被恶意用户篡改,导致程序行为异常或泄露敏感信息。不过对于普通的桌面应用,这通常不是问题。
  • 日志敏感信息泄露:默认关闭 debug 日志是一个良好的安全实践,可以防止在发布版本中意外输出敏感信息(如密码、Token 等)。但 qDebug() << "Application starting with arguments:" << QCoreApplication::arguments(); 这行代码存在风险,因为命令行参数可能包含敏感信息(如密码参数 --password=123),将其打印到日志中可能导致敏感信息泄露。
    • 建议:移除该行日志,或确保过滤掉命令行中的敏感参数。

改进后的代码建议

结合上述分析,我为你提供一份改进后的代码参考:

#include <QDebug>
#include <iostream>
#include <QLoggingCategory>
#include <QCoreApplication> // 确保包含了对应的头文件

DWIDGET_USE_NAMESPACE

// 使用 constexpr 替代 C 风格的 const char*
static constexpr const char* DEFAULT_LOGGING_RULES = "*.debug=false";

static void initLoggingRules()
{
    QByteArray rules = qgetenv("QT_LOGGING_RULES");
    if (rules.isEmpty()) {
        QLoggingCategory::setFilterRules(DEFAULT_LOGGING_RULES);
    } else {
        // 如果设置了环境变量,可以选择在启动时打印一下,方便调试
        // 注意:这里用 qCInfo 或者不打印,因为 qDebug 可能已被环境变量屏蔽
    }
}

int main(int argc, char *argv[])
{
    // 1. 创建 QCoreApplication 实例 (假设原代码中有)
    QCoreApplication app(argc, argv); 

    // 2. 初始化日志规则
    initLoggingRules();

    // 3. 修复逻辑冲突:将 qDebug 改为 qInfo,确保默认情况下也能看到启动参数
    // 安全提示:请确保 QCoreApplication::arguments() 中不包含敏感信息(如密码)
    qInfo() << "Application starting with arguments:" << QCoreApplication::arguments();
    
    DCORE_USE_NAMESPACE
    PerformanceMonitor::initializeAppStart();
    
    // ... 其他代码
    return app.exec();
}

主要改动点说明:

  1. DEFAULT_LOGGING_RULES 修改为 constexpr,增强 C++ 类型安全性。
  2. 明确指出了 QCoreApplication 必须在调用 arguments() 之前实例化的隐含依赖。
  3. qDebug() 改为 qInfo(),解决了默认屏蔽 debug 日志导致启动信息无法输出的逻辑矛盾。
  4. 添加了关于命令行参数可能包含敏感信息的安全提醒。

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: add-uos, lzwind

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@deepin-bot

deepin-bot Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

TAG Bot

New tag: 6.5.55
DISTRIBUTION: unstable
Suggest: synchronizing this PR through rebase #478

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants