From 1faffb31b5b3347b43811b03d2f8feb0a23fbcaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A6=83=E6=9C=AC=E5=AD=A6?= Date: Tue, 12 Dec 2023 11:47:14 +0800 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20=E5=85=81=E8=AE=B8=E5=9F=BA?= =?UTF-8?q?=E4=BA=8Edtk=E5=BC=80=E5=8F=91=E7=9A=84=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=8E=A7=E5=88=B6=E5=85=B6=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E7=AD=89=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在运行中,不需要重启应用,也可以通过配置项控制日志输出等级 注: 应用的applicationName 需要和dconfig安装时的appid等同方可识别 配置规则等同于QT_LOGGING_RULES 注意:由于 dtk/dtk6 的存在 meta 文件 在 libdtkdata 中安装 Log: 允许基于dtk开发的应用动态控制其日志输出等级 Influence: 允许基于dtk开发的应用动态控制其日志输出等级 Task: https://pms.uniontech.com/task-view-307567.html https://pms.uniontech.com/task-view-305899.html --- src/log/LogManager.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/log/LogManager.cpp b/src/log/LogManager.cpp index 6d0573a6..c262a1d4 100644 --- a/src/log/LogManager.cpp +++ b/src/log/LogManager.cpp @@ -4,6 +4,8 @@ #include #include "LogManager.h" +#include "dconfig.h" + #include #include #include @@ -14,6 +16,9 @@ DCORE_BEGIN_NAMESPACE +#define RULES_KEY ("rules") +Q_GLOBAL_STATIC_WITH_ARGS(DConfig, _d_dconfig, ("org.deepin.dtk.loggingrules")); + // Courtesy qstandardpaths_unix.cpp static void appendOrganizationAndApp(QString &path) { @@ -62,6 +67,30 @@ DLogManager::DLogManager() { spdlog::set_automatic_registration(true); spdlog::set_pattern("%v"); + + /* QT_LOGGING_RULES环境变量设置日志的优先级最高,会与dconfig的设置冲突, + * 此处记录该环境变量的值然后unset掉,如果未使用dconfig进行设置则使用该环境变量的值。*/ + QByteArray logRules = qgetenv("QT_LOGGING_RULES"); + qunsetenv("QT_LOGGING_RULES"); + + if (!logRules.isEmpty()) { + QLoggingCategory::setFilterRules(logRules.replace(";", "\n")); + } + + if (_d_dconfig->isValid()) { + auto updateLoggingRules = [](const QString & key) { + if (key != RULES_KEY) + return; + + const QVariant &var = _d_dconfig->value(RULES_KEY); + if (var.isValid() && !var.toString().isEmpty()) { + QLoggingCategory::setFilterRules(var.toString().replace(";", "\n")); + } + }; + + updateLoggingRules(RULES_KEY); + QObject::connect(_d_dconfig, &DConfig::valueChanged, _d_dconfig, updateLoggingRules); + } } void DLogManager::initConsoleAppender(){ From 675985506d17f63a709524148644162016cbe7e6 Mon Sep 17 00:00:00 2001 From: xuxin Date: Mon, 18 Dec 2023 16:14:28 +0800 Subject: [PATCH 2/9] =?UTF-8?q?fix:=20lshw=E6=9F=A5=E8=AF=A2=E5=86=85?= =?UTF-8?q?=E5=AD=98=E5=A4=A7=E5=B0=8F=E6=97=B6=E8=BF=94=E5=9B=9E=E5=A4=9A?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E6=95=B0=E7=BB=84,=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整json结果解析过程 Log: 在不同场景下lshw可能返回多个元素 Influence: DSysInfo::memoryInstalledSize解析过程 Bug: https://pms.uniontech.com/bug-view-228681.html Change-Id: I51030f037fa272ef9d510265524e5ec934c1f9bd --- src/dsysinfo.cpp | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/dsysinfo.cpp b/src/dsysinfo.cpp index b964f59c..34896db9 100644 --- a/src/dsysinfo.cpp +++ b/src/dsysinfo.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #ifdef Q_OS_LINUX @@ -37,6 +38,12 @@ static inline bool inTest() DCORE_BEGIN_NAMESPACE +#ifdef QT_DEBUG +Q_LOGGING_CATEGORY(logSysInfo, "dtk.dsysinfo") +#else +Q_LOGGING_CATEGORY(logSysInfo, "dtk.dsysinfo", QtInfoMsg) +#endif + class Q_DECL_HIDDEN DSysInfoPrivate { public: @@ -1122,18 +1129,35 @@ qint64 DSysInfo::memoryInstalledSize() } const QByteArray &lshwInfoJson = lshw.readAllStandardOutput(); - QJsonArray lshwResultArray = QJsonDocument::fromJson(lshwInfoJson).array(); - if (!lshwResultArray.isEmpty()) { - QJsonValue memoryHwInfo = lshwResultArray.first(); - QString id = memoryHwInfo.toObject().value("id").toString(); - Q_ASSERT(id == "memory"); - siGlobal->memoryInstalledSize = memoryHwInfo.toObject().value("size").toDouble(); // TODO: check "units" is "bytes" ? + + QJsonParseError error; + auto doc = QJsonDocument::fromJson(lshwInfoJson, &error); + if (error.error != QJsonParseError::NoError) { + qCWarning(logSysInfo(), "parse failed, expect json doc from lshw command"); + return -1; + } + + if (!doc.isArray()) { + qCWarning(logSysInfo(), "parse failed, expect array"); + return -1; + } + + QJsonArray lshwResultArray = doc.array(); + for (const QJsonValue value : lshwResultArray) { + QJsonObject obj = value.toObject(); + if (obj.contains("id") && obj.value("id").toString() == "memory") { + siGlobal->memoryInstalledSize = obj.value("size").toDouble(); // TODO: check "units" is "bytes" ? + break; + } } } + Q_ASSERT(siGlobal->memoryInstalledSize > 0); + return siGlobal->memoryInstalledSize; -#endif +#else return -1; +#endif } /*! From 0613eba47ab27251baac04de2bd22952d0fa4fcc Mon Sep 17 00:00:00 2001 From: chenjun Date: Thu, 25 Jan 2024 13:55:46 +0800 Subject: [PATCH 3/9] =?UTF-8?q?fix:=20=E4=BB=8E=E6=96=87=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=E8=AF=BB=E5=8F=96deepinType=E5=92=8CproductType=E5=80=BC?= =?UTF-8?q?=E6=97=B6=E5=9B=A0=E4=B8=BA=E6=9D=83=E9=99=90=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BC=9A=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 安装了三方管控应用时,从文件中读取deepinType和productType值时因为权限问题会失败,需要重新读取一次 Log: 修复第一次读取配置文件失败导致无法显示系统版本和说明问题 Influence: 正常显示版本和说明 --- src/dsysinfo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dsysinfo.cpp b/src/dsysinfo.cpp index 34896db9..1d1777b6 100644 --- a/src/dsysinfo.cpp +++ b/src/dsysinfo.cpp @@ -157,7 +157,7 @@ bool DSysInfoPrivate::splitA_BC_DMode() void DSysInfoPrivate::ensureDeepinInfo() { - if (static_cast(deepinType) >= 0 && !inTest()) + if (static_cast(deepinType) > 0 && !inTest()) return; if (inTest()) @@ -430,7 +430,7 @@ static bool readLsbRelease(DSysInfoPrivate *info) void DSysInfoPrivate::ensureReleaseInfo() { - if (productType >= 0 && !inTest()) { + if (productType > 0 && !inTest()) { return; } From cc1c5c384562f5b9ddccc7dd65e887c7cb9b56b2 Mon Sep 17 00:00:00 2001 From: YinJie Date: Wed, 20 Dec 2023 15:17:10 +0800 Subject: [PATCH 4/9] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0registerLoggingRu?= =?UTF-8?q?lesWatcher=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 功能:监听 dconfig 的值然后设置应用的日志级别 目的: 1.取消QT_LOGGING_RULES需要在创建 application之前处理 因为QLoggingRegistry在构造函数中获取环境变量的值后不会监听环境变量的变化. 目前直接使用applicationName当做appId 的做法不可行. 2.不和应用的 applicationName耦合目前大部分应用的applicationName和dconfig 的appId是不一样的,需要修改应用的名字 可能存在多个 application 使用通过一个 dconfig 的情况,修改applicantionName的方法不可行. PS:从 DConfig 获取默认 appId 的逻辑上看, DSGApplication应用会有问题 3.开发者可以选择是否需要设置以及监听日志级别变动 Log: Task: https://pms.uniontech.com/task-view-303379.html --- include/log/LogManager.h | 8 ++++ src/log/LogManager.cpp | 82 ++++++++++++++++++++++++++++------------ 2 files changed, 65 insertions(+), 25 deletions(-) diff --git a/include/log/LogManager.h b/include/log/LogManager.h index ab07805c..deeccf75 100644 --- a/include/log/LogManager.h +++ b/include/log/LogManager.h @@ -31,10 +31,18 @@ class LIBDTKCORESHARED_EXPORT DLogManager static void setLogFormat(const QString &format); + /*! + * \brief 监听 org.deepin.dtk.log 的变化动态调整应用的日志输出规则 + * 此方法应该在创建 QApplication 之前调用,否则 QT_LOGGING_RULES 环境变量会覆盖 dconfig 的的值 + * \a logFilePath 指定 dconfig 的 appId + */ + static void registerLoggingRulesWatcher(const QString &appId); + private: void initConsoleAppender(); void initRollingFileAppender(); void initJournalAppender(); + void initLoggingRules(const QString &appId); QString joinPath(const QString &path, const QString &fileName); inline static DLogManager* instance(){ diff --git a/src/log/LogManager.cpp b/src/log/LogManager.cpp index c262a1d4..68c09da2 100644 --- a/src/log/LogManager.cpp +++ b/src/log/LogManager.cpp @@ -17,7 +17,6 @@ DCORE_BEGIN_NAMESPACE #define RULES_KEY ("rules") -Q_GLOBAL_STATIC_WITH_ARGS(DConfig, _d_dconfig, ("org.deepin.dtk.loggingrules")); // Courtesy qstandardpaths_unix.cpp static void appendOrganizationAndApp(QString &path) @@ -43,12 +42,19 @@ class DLogManagerPrivate { , q_ptr(q) { } + ~DLogManagerPrivate() { + if (m_loggingRulesConfig) { + delete m_loggingRulesConfig; + m_loggingRulesConfig = nullptr; + } + } QString m_format; QString m_logPath; ConsoleAppender* m_consoleAppender = nullptr; RollingFileAppender* m_rollingFileAppender = nullptr; JournalAppender* m_journalAppender = nullptr; + DConfig* m_loggingRulesConfig = nullptr; DLogManager *q_ptr = nullptr; Q_DECLARE_PUBLIC(DLogManager) @@ -67,30 +73,6 @@ DLogManager::DLogManager() { spdlog::set_automatic_registration(true); spdlog::set_pattern("%v"); - - /* QT_LOGGING_RULES环境变量设置日志的优先级最高,会与dconfig的设置冲突, - * 此处记录该环境变量的值然后unset掉,如果未使用dconfig进行设置则使用该环境变量的值。*/ - QByteArray logRules = qgetenv("QT_LOGGING_RULES"); - qunsetenv("QT_LOGGING_RULES"); - - if (!logRules.isEmpty()) { - QLoggingCategory::setFilterRules(logRules.replace(";", "\n")); - } - - if (_d_dconfig->isValid()) { - auto updateLoggingRules = [](const QString & key) { - if (key != RULES_KEY) - return; - - const QVariant &var = _d_dconfig->value(RULES_KEY); - if (var.isValid() && !var.toString().isEmpty()) { - QLoggingCategory::setFilterRules(var.toString().replace(";", "\n")); - } - }; - - updateLoggingRules(RULES_KEY); - QObject::connect(_d_dconfig, &DConfig::valueChanged, _d_dconfig, updateLoggingRules); - } } void DLogManager::initConsoleAppender(){ @@ -144,6 +126,56 @@ void DLogManager::registerJournalAppender() DLogManager::instance()->initJournalAppender(); } +void DLogManager::initLoggingRules(const QString &appId) +{ + if (appId.isEmpty()) { + qWarning() << "App id is empty, logging rules won't take effect"; + return; + } + + // QT_LOGGING_RULES环境变量设置日志的优先级最高 + // QLoggingRegistry 初始化时会获取 QT_LOGGING_RULES 的值并保存,后续重置了环境变量 QLoggingRegistry 不会进行同步 + // 需要在 QLoggingRegistry 初始化之前重置 QT_LOGGING_RULES 的值 + QByteArray logRules = qgetenv("QT_LOGGING_RULES"); + qunsetenv("QT_LOGGING_RULES"); + + if (!logRules.isEmpty()) { + QLoggingCategory::setFilterRules(logRules.replace(";", "\n")); + } + + Q_D(DLogManager); + d->m_loggingRulesConfig = DConfig::create(appId, "org.deepin.dtk.loggingrules"); + if (!d->m_loggingRulesConfig) { + qWarning() << "Create logging rules dconfig object failed, logging rules won't take effect"; + return; + } + + if (!d->m_loggingRulesConfig->isValid()) { + qWarning() << "Logging rules config is invalid, please check `appId` arg is correct"; + delete d->m_loggingRulesConfig; + d->m_loggingRulesConfig = nullptr; + return; + } + + auto updateLoggingRules = [d](const QString & key) { + if (key != RULES_KEY) + return; + + const QVariant &var = d->m_loggingRulesConfig->value(RULES_KEY); + if (var.isValid() && !var.toString().isEmpty()) { + QLoggingCategory::setFilterRules(var.toString().replace(";", "\n")); + } + }; + + updateLoggingRules(RULES_KEY); + QObject::connect(d->m_loggingRulesConfig, &DConfig::valueChanged, d->m_loggingRulesConfig, updateLoggingRules); +} + +void DLogManager::registerLoggingRulesWatcher(const QString &appId) +{ + DLogManager::instance()->initLoggingRules(appId); +} + /*! @~english \brief Return the path file log storage. From ecff4b3905cfd23dd4364fe6ed75e76177bab825 Mon Sep 17 00:00:00 2001 From: YinJie Date: Fri, 26 Jan 2024 13:20:00 +0800 Subject: [PATCH 5/9] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=20build=20=E7=89=88=E6=9C=AC=E5=8F=B7=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 场景如下(完整版本号 -> 构建版本号): 5.6.8 -> 0 5.6.8.7 -> 7 5.6.8+u001 -> 1 5.6.8.7+u001 -> 7 5.6.8.0+u001 -> 0 Log: Influence: 构建版本号(BUILD_VERSION ) --- debian/rules | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/debian/rules b/debian/rules index 62e9187d..f8c59697 100755 --- a/debian/rules +++ b/debian/rules @@ -8,9 +8,15 @@ DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) VERSION = $(DEB_VERSION_UPSTREAM) PACK_VER = $(shell echo $(VERSION) | awk -F'[+_~-]' '{print $$1}') -# Fix: invalid digit "8" in octal constant. e.g. u008 ==> 008 ==> 8 -BUILD_VER = $(shell echo $(VERSION) | awk -F'[+_~-]' '{print $$2}' | sed 's/[^0-9]//g' | awk '{print int($$1)}') +# Calculate build version: +# 5.6.8 -> 0; 5.6.8.7 -> 7; 5.6.8+u001 -> 1; 5.6.8.7+u001 -> 7; 5.6.8.0+u001 -> 0 +BUILD_VER = $(shell echo $(VERSION) | awk -F'[+_~-]' '{print $$1}' | awk -F'.' '{print $$4}' | sed 's/[^0-9]//g' | awk '{print int($$1)}') +ifeq ($(BUILD_VER), 0) +ifeq ($(shell expr $(shell echo "$(VERSION)" | awk -F. '{print NF-1}') '<' 3), 1) + BUILD_VER=$(shell echo $(VERSION) | awk -F'[+_~-]' '{print $$2}' | sed 's/[^0-9]//g' | awk '{print int($$1)}') +endif +endif %: dh $@ From 950f23f76d9daaf15f8df0e5598fa736e9accd51 Mon Sep 17 00:00:00 2001 From: tanfeng Date: Mon, 29 Jan 2024 11:42:02 +0800 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20DeepinType=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=9B=E7=94=A8=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DeepinType类型增加军用版 Log: DeepinType类型增加军用版 Task: https://pms.uniontech.com/task-view-316703.html Influence: DeepinType类型 Change-Id: I9db5a3d14eebab69b5cac44fbfb0d2a09d8d84c3 --- include/global/dsysinfo.h | 3 ++- src/dsysinfo.cpp | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/include/global/dsysinfo.h b/include/global/dsysinfo.h index c159461c..24293b87 100644 --- a/include/global/dsysinfo.h +++ b/include/global/dsysinfo.h @@ -38,7 +38,8 @@ class LIBDTKCORESHARED_EXPORT DSysInfo DeepinDesktop, DeepinProfessional, DeepinServer, - DeepinPersonal + DeepinPersonal, + DeepinMilitary }; enum LogoType { diff --git a/src/dsysinfo.cpp b/src/dsysinfo.cpp index 1d1777b6..052ffa5e 100644 --- a/src/dsysinfo.cpp +++ b/src/dsysinfo.cpp @@ -227,6 +227,8 @@ void DSysInfoPrivate::ensureDeepinInfo() deepinType = DSysInfo::DeepinServer; } else if (deepin_type == "Personal") { deepinType = DSysInfo::DeepinPersonal; + } else if (deepin_type == "Military") { + deepinType = DSysInfo::DeepinMilitary; } else { deepinType = DSysInfo::UnknownDeepin; } From 7c7c2bc7d6b860e2b6746ca31800c749db595256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A6=83=E6=9C=AC=E5=AD=A6?= Date: Thu, 1 Feb 2024 10:46:55 +0800 Subject: [PATCH 7/9] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E6=97=B6=E9=97=B4=E6=88=B3=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 适配qt的日志格式 %{time yyyy-MM-ddTHH:mm:ss.zzz} ==> %{time}{yyyy-MM-ddTHH:mm:ss.zzz} Log: 修复日志格式时间戳显示异常问题 Bug: https://pms.uniontech.com/bug-view-236239.html Influence: 使用DLogManager的应用日志输出格式 --- src/log/AbstractStringAppender.cpp | 5 +++++ src/log/ConsoleAppender.cpp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/log/AbstractStringAppender.cpp b/src/log/AbstractStringAppender.cpp index 78ae2199..8cf35185 100644 --- a/src/log/AbstractStringAppender.cpp +++ b/src/log/AbstractStringAppender.cpp @@ -339,6 +339,11 @@ QString AbstractStringAppender::formattedString(const QDateTime &time, Logger::L bool withcolor) const { QString f = format(); + + // dtkcore无法正确解析Qt的日志格式,dtk默认的日志格式并未和Qt统一,解析方式需要兼容两种不同的格式。 + if (f.contains(QLatin1String("time "))) + f.replace(f.indexOf(' ', f.indexOf(QLatin1String("time")) + QLatin1String("time").size()), 1, QLatin1String("}{")); + const int size = f.size(); QString result; diff --git a/src/log/ConsoleAppender.cpp b/src/log/ConsoleAppender.cpp index c89a9c43..6969b5b7 100644 --- a/src/log/ConsoleAppender.cpp +++ b/src/log/ConsoleAppender.cpp @@ -38,7 +38,7 @@ DCORE_BEGIN_NAMESPACE ConsoleAppender::ConsoleAppender() : AbstractStringAppender() - ,m_ignoreEnvPattern(false) + , m_ignoreEnvPattern(false) { if (!spdlog::get("console")) { auto clogger = spdlog::stdout_color_mt("console"); From 2a7c5aee3a67db08b400e550e54bacad676d8bb9 Mon Sep 17 00:00:00 2001 From: ck Date: Fri, 10 May 2024 10:57:17 +0800 Subject: [PATCH 8/9] chore: loggingrules config move to preference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit org.deepin.dtk.logginerules ==> org.deepin.dtk.preference 如果 DConfig 无效就不清空环境变量 --- src/log/LogManager.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/log/LogManager.cpp b/src/log/LogManager.cpp index 68c09da2..561e19c7 100644 --- a/src/log/LogManager.cpp +++ b/src/log/LogManager.cpp @@ -133,18 +133,8 @@ void DLogManager::initLoggingRules(const QString &appId) return; } - // QT_LOGGING_RULES环境变量设置日志的优先级最高 - // QLoggingRegistry 初始化时会获取 QT_LOGGING_RULES 的值并保存,后续重置了环境变量 QLoggingRegistry 不会进行同步 - // 需要在 QLoggingRegistry 初始化之前重置 QT_LOGGING_RULES 的值 - QByteArray logRules = qgetenv("QT_LOGGING_RULES"); - qunsetenv("QT_LOGGING_RULES"); - - if (!logRules.isEmpty()) { - QLoggingCategory::setFilterRules(logRules.replace(";", "\n")); - } - Q_D(DLogManager); - d->m_loggingRulesConfig = DConfig::create(appId, "org.deepin.dtk.loggingrules"); + d->m_loggingRulesConfig = DConfig::create(appId, "org.deepin.dtk.preference"); if (!d->m_loggingRulesConfig) { qWarning() << "Create logging rules dconfig object failed, logging rules won't take effect"; return; @@ -157,6 +147,16 @@ void DLogManager::initLoggingRules(const QString &appId) return; } + // QT_LOGGING_RULES环境变量设置日志的优先级最高 + // QLoggingRegistry 初始化时会获取 QT_LOGGING_RULES 的值并保存,后续重置了环境变量 QLoggingRegistry 不会进行同步 + // 需要在 QLoggingRegistry 初始化之前重置 QT_LOGGING_RULES 的值 + QByteArray logRules = qgetenv("QT_LOGGING_RULES"); + qunsetenv("QT_LOGGING_RULES"); + + if (!logRules.isEmpty()) { + QLoggingCategory::setFilterRules(logRules.replace(";", "\n")); + } + auto updateLoggingRules = [d](const QString & key) { if (key != RULES_KEY) return; From 58858e3c72182dbb5f5b6aadc5d8962913520284 Mon Sep 17 00:00:00 2001 From: ck Date: Fri, 10 May 2024 15:36:23 +0800 Subject: [PATCH 9/9] refactor: remove LoggingRules interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除相关接口, 默认启用(可以用 DTK_DISABLED_LOGGING_RULES 禁用) - 优先使用 dsgAppId , 用户可以通过 DTK_LOGGING_FALLBACK_APPID 指定 fallbackAppId - 有配置过 rules 时, 优先使用(即非默认值优先) - fallbackConfig 发生变化时会检查 dsgConfig 是否修改过,是则忽略 --- include/log/LogManager.h | 8 --- src/log/LogManager.cpp | 125 +++++++++++++++++++++------------------ 2 files changed, 66 insertions(+), 67 deletions(-) diff --git a/include/log/LogManager.h b/include/log/LogManager.h index deeccf75..ab07805c 100644 --- a/include/log/LogManager.h +++ b/include/log/LogManager.h @@ -31,18 +31,10 @@ class LIBDTKCORESHARED_EXPORT DLogManager static void setLogFormat(const QString &format); - /*! - * \brief 监听 org.deepin.dtk.log 的变化动态调整应用的日志输出规则 - * 此方法应该在创建 QApplication 之前调用,否则 QT_LOGGING_RULES 环境变量会覆盖 dconfig 的的值 - * \a logFilePath 指定 dconfig 的 appId - */ - static void registerLoggingRulesWatcher(const QString &appId); - private: void initConsoleAppender(); void initRollingFileAppender(); void initJournalAppender(); - void initLoggingRules(const QString &appId); QString joinPath(const QString &path, const QString &fileName); inline static DLogManager* instance(){ diff --git a/src/log/LogManager.cpp b/src/log/LogManager.cpp index 561e19c7..3f99ee85 100644 --- a/src/log/LogManager.cpp +++ b/src/log/LogManager.cpp @@ -5,7 +5,7 @@ #include #include "LogManager.h" #include "dconfig.h" - +#include #include #include #include @@ -17,7 +17,6 @@ DCORE_BEGIN_NAMESPACE #define RULES_KEY ("rules") - // Courtesy qstandardpaths_unix.cpp static void appendOrganizationAndApp(QString &path) { @@ -42,24 +41,80 @@ class DLogManagerPrivate { , q_ptr(q) { } - ~DLogManagerPrivate() { - if (m_loggingRulesConfig) { - delete m_loggingRulesConfig; - m_loggingRulesConfig = nullptr; - } - } + + DConfig *createDConfig(const QString &appId); + void initLoggingRules(); + void updateLoggingRules(); QString m_format; QString m_logPath; ConsoleAppender* m_consoleAppender = nullptr; RollingFileAppender* m_rollingFileAppender = nullptr; JournalAppender* m_journalAppender = nullptr; - DConfig* m_loggingRulesConfig = nullptr; + QScopedPointer m_dsgConfig; + QScopedPointer m_fallbackConfig; DLogManager *q_ptr = nullptr; Q_DECLARE_PUBLIC(DLogManager) }; + +DConfig *DLogManagerPrivate::createDConfig(const QString &appId) +{ + if (appId.isEmpty()) + return nullptr; + + DConfig *config = DConfig::create(appId, "org.deepin.dtk.preference"); + if (!config->isValid()) { + qWarning() << "Logging rules config is invalid, please check `appId` [" << appId << "]arg is correct"; + delete config; + config = nullptr; + return nullptr; + } + + QObject::connect(config, &DConfig::valueChanged, config, [this](const QString &key) { + if (key != RULES_KEY) + return; + + updateLoggingRules(); + }); + + return config; +} + +void DLogManagerPrivate::initLoggingRules() +{ + if (qEnvironmentVariableIsSet("DTK_DISABLED_LOGGING_RULES")) + return; + + // 1. 未指定 fallbackId 时,以 dsgAppId 为准 + QString dsgAppId = DSGApplication::id(); + m_dsgConfig.reset(createDConfig(dsgAppId)); + + QString fallbackId = qgetenv("DTK_LOGGING_FALLBACK_APPID"); + // 2. fallbackId 和 dsgAppId 非空且不等时,都创建和监听变化 + if (!fallbackId.isEmpty() && fallbackId != dsgAppId) + m_fallbackConfig.reset(createDConfig(fallbackId)); + + // 3. 默认值和非默认值时,非默认值优先 + updateLoggingRules(); +} + +void DLogManagerPrivate::updateLoggingRules() +{ + QVariant var; + // 4. 优先看 dsgConfig 是否默认值,其次 fallback 是否默认值 + if (m_dsgConfig && !m_dsgConfig->isDefaultValue(RULES_KEY)) { + var = m_dsgConfig->value(RULES_KEY); + } else if (m_fallbackConfig && !m_fallbackConfig->isDefaultValue(RULES_KEY)) { + var = m_fallbackConfig->value(RULES_KEY); + } else { + // do nothing.. + } + + if (var.isValid()) + QLoggingCategory::setFilterRules(var.toString().replace(";", "\n")); +} /*! @~english \class Dtk::Core::DLogManager @@ -73,6 +128,8 @@ DLogManager::DLogManager() { spdlog::set_automatic_registration(true); spdlog::set_pattern("%v"); + + d_ptr->initLoggingRules(); } void DLogManager::initConsoleAppender(){ @@ -126,56 +183,6 @@ void DLogManager::registerJournalAppender() DLogManager::instance()->initJournalAppender(); } -void DLogManager::initLoggingRules(const QString &appId) -{ - if (appId.isEmpty()) { - qWarning() << "App id is empty, logging rules won't take effect"; - return; - } - - Q_D(DLogManager); - d->m_loggingRulesConfig = DConfig::create(appId, "org.deepin.dtk.preference"); - if (!d->m_loggingRulesConfig) { - qWarning() << "Create logging rules dconfig object failed, logging rules won't take effect"; - return; - } - - if (!d->m_loggingRulesConfig->isValid()) { - qWarning() << "Logging rules config is invalid, please check `appId` arg is correct"; - delete d->m_loggingRulesConfig; - d->m_loggingRulesConfig = nullptr; - return; - } - - // QT_LOGGING_RULES环境变量设置日志的优先级最高 - // QLoggingRegistry 初始化时会获取 QT_LOGGING_RULES 的值并保存,后续重置了环境变量 QLoggingRegistry 不会进行同步 - // 需要在 QLoggingRegistry 初始化之前重置 QT_LOGGING_RULES 的值 - QByteArray logRules = qgetenv("QT_LOGGING_RULES"); - qunsetenv("QT_LOGGING_RULES"); - - if (!logRules.isEmpty()) { - QLoggingCategory::setFilterRules(logRules.replace(";", "\n")); - } - - auto updateLoggingRules = [d](const QString & key) { - if (key != RULES_KEY) - return; - - const QVariant &var = d->m_loggingRulesConfig->value(RULES_KEY); - if (var.isValid() && !var.toString().isEmpty()) { - QLoggingCategory::setFilterRules(var.toString().replace(";", "\n")); - } - }; - - updateLoggingRules(RULES_KEY); - QObject::connect(d->m_loggingRulesConfig, &DConfig::valueChanged, d->m_loggingRulesConfig, updateLoggingRules); -} - -void DLogManager::registerLoggingRulesWatcher(const QString &appId) -{ - DLogManager::instance()->initLoggingRules(appId); -} - /*! @~english \brief Return the path file log storage.