Skip to content

Commit 46a666b

Browse files
committed
fix(logging): filter Qt logs by app log level
* Adds an application-level log threshold to suppress unwanted Qt messages even when categories still emit them * Syncs CLI/config log-level selection with the global handler for consistent verbosity across startup and runtime * Improves startup environment logging formatting for clearer diagnostics * Updates default config log level to reduce noisy output by default
1 parent eb4f8bf commit 46a666b

5 files changed

Lines changed: 85 additions & 18 deletions

File tree

src/Application.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,49 @@
3636
#include "GpgFrontendContext.h"
3737
#include "Initialize.h"
3838

39+
namespace {
40+
41+
std::atomic<int> g_log_level{static_cast<int>(GpgFrontend::GFLogLevel::kINFO)};
42+
43+
auto ShouldLogMessage(QtMsgType type, GpgFrontend::GFLogLevel level) -> bool {
44+
switch (level) {
45+
case GpgFrontend::GFLogLevel::kDEBUG:
46+
return true;
47+
48+
case GpgFrontend::GFLogLevel::kINFO:
49+
return type != QtDebugMsg;
50+
51+
case GpgFrontend::GFLogLevel::kWARNING:
52+
return type != QtDebugMsg && type != QtInfoMsg;
53+
54+
case GpgFrontend::GFLogLevel::kCRITICAL:
55+
return type == QtCriticalMsg || type == QtFatalMsg;
56+
57+
case GpgFrontend::GFLogLevel::kFATAL:
58+
return type == QtFatalMsg;
59+
60+
default:
61+
return type != QtDebugMsg;
62+
}
63+
}
64+
65+
} // namespace
66+
3967
namespace GpgFrontend {
4068

69+
void SetGFLogLevel(int level) {
70+
g_log_level.store(level, std::memory_order_relaxed);
71+
}
72+
4173
void GFMessageHandler(QtMsgType type, const QMessageLogContext& context,
4274
const QString& msg) {
75+
const auto level =
76+
static_cast<GFLogLevel>(g_log_level.load(std::memory_order_relaxed));
77+
78+
if (!ShouldLogMessage(type, level)) {
79+
return;
80+
}
81+
4382
const QString formatted = qFormatLogMessage(type, context, msg);
4483

4584
GFLogEntry entry;

src/Application.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@
3232

3333
namespace GpgFrontend {
3434

35+
/**
36+
* @brief
37+
*
38+
* @param level
39+
*/
40+
void SetGFLogLevel(int level);
41+
3542
/**
3643
* @brief
3744
*

src/Command.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,15 +173,19 @@ auto ParseLogLevel(const QString& log_level) -> int {
173173
if (log_level == "none") return 0;
174174

175175
if (log_level == "debug") {
176+
SetGFLogLevel(static_cast<int>(GFLogLevel::kDEBUG));
176177
QLoggingCategory::setFilterRules(
177178
BuildQtLoggingFilterRules(static_cast<int>(GFLogLevel::kDEBUG)));
178179
} else if (log_level == "info") {
180+
SetGFLogLevel(static_cast<int>(GFLogLevel::kINFO));
179181
QLoggingCategory::setFilterRules(
180182
BuildQtLoggingFilterRules(static_cast<int>(GFLogLevel::kINFO)));
181183
} else if (log_level == "warn") {
184+
SetGFLogLevel(static_cast<int>(GFLogLevel::kWARNING));
182185
QLoggingCategory::setFilterRules(
183186
BuildQtLoggingFilterRules(static_cast<int>(GFLogLevel::kWARNING)));
184187
} else if (log_level == "error") {
188+
SetGFLogLevel(static_cast<int>(GFLogLevel::kCRITICAL));
185189
QLoggingCategory::setFilterRules(
186190
BuildQtLoggingFilterRules(static_cast<int>(GFLogLevel::kCRITICAL)));
187191
} else {

src/GpgFrontendContext.cpp

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@
3636
#include "core/GFLog.h"
3737
#include "ui/GpgFrontendApplication.h"
3838

39+
namespace {
40+
auto BoolText(bool value) -> QString {
41+
return value ? QStringLiteral("true") : QStringLiteral("false");
42+
}
43+
44+
auto DisplayPath(const QString& path) -> QString {
45+
return path.isEmpty() ? QStringLiteral("<empty>") : path;
46+
}
47+
} // namespace
48+
3949
namespace GpgFrontend {
4050

4151
void GpgFrontendContext::load_env_conf_set_properties() {
@@ -49,31 +59,37 @@ void GpgFrontendContext::load_env_conf_set_properties() {
4959

5060
property("GFSelfCheck", s.value("SelfCheck", false).toBool());
5161
property("GFSecureLevel", s.value("SecureLevel", 0).toInt());
52-
property("GFLogLevel",
53-
s.value("LogLevel", static_cast<int>(GFLogLevel::kWARNING)).toInt());
62+
property(
63+
"GFLogLevel",
64+
s.value("LogLevel", static_cast<int>(GFLogLevel::kCRITICAL)).toInt());
5465
property("GFPortableMode", s.value("PortableMode", false).toBool());
5566
property("GFGnuPGOfflineMode", s.value("GnuPGOfflineMode", false).toBool());
5667
property("GFPinentryProgramPath",
5768
s.value("PinentryProgramPath", "").toString());
5869
property("GFLogRingBufferCapacity",
5970
s.value("LogRingBufferCapacity", 1024).toInt());
6071

61-
qInfo() << "ENV"
62-
<< "GFSelfCheck" << property("GFSelfCheck").toInt();
63-
qInfo() << "ENV"
64-
<< "GFSecureLevel" << property("GFSecureLevel").toInt();
65-
qInfo() << "ENV"
66-
<< "GFLogLevel" << property("GFLogLevel").toInt();
67-
qInfo() << "ENV"
68-
<< "GFPortableMode" << property("GFPortableMode").toBool();
69-
qInfo() << "ENV"
70-
<< "GFGnuPGOfflineMode" << property("GFGnuPGOfflineMode").toBool();
71-
qInfo() << "ENV"
72-
<< "GFPinentryProgramPath"
73-
<< property("GFPinentryProgramPath").toString();
74-
qInfo() << "ENV"
75-
<< "GFLogRingBufferCapacity"
76-
<< property("GFLogRingBufferCapacity").toInt();
72+
const auto self_check = property("GFSelfCheck").toInt();
73+
const auto secure_level = property("GFSecureLevel").toInt();
74+
const auto log_level = property("GFLogLevel").toInt();
75+
const auto portable_mode = property("GFPortableMode").toBool();
76+
const auto gpg_offline_mode = property("GFGnuPGOfflineMode").toBool();
77+
const auto pinentry_program_path =
78+
property("GFPinentryProgramPath").toString();
79+
const auto ring_buffer_capacity = property("GFLogRingBufferCapacity").toInt();
80+
81+
qInfo().noquote().nospace()
82+
<< "\n"
83+
<< "================ GpgFrontend Startup Environment ================\n"
84+
<< "Self Check : " << self_check << "\n"
85+
<< "Secure Level : " << secure_level << "\n"
86+
<< "Log Level : " << log_level << "\n"
87+
<< "Portable Mode : " << BoolText(portable_mode) << "\n"
88+
<< "GnuPG Offline Mode : " << BoolText(gpg_offline_mode) << "\n"
89+
<< "Pinentry Program Path : " << DisplayPath(pinentry_program_path)
90+
<< "\n"
91+
<< "Log Ring Buffer Capacity: " << ring_buffer_capacity << "\n"
92+
<< "==================================================================";
7793
}
7894

7995
void GpgFrontendContext::InitApplication() {

src/Initialize.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ void PreInit(const GFCxtWPtr &p_ctx) {
8888

8989
const int log_level = app->property("GFLogLevel").toInt();
9090
QLoggingCategory::setFilterRules(BuildQtLoggingFilterRules(log_level));
91+
SetGFLogLevel(log_level);
9192

9293
#ifdef RELEASE
9394
qSetMessagePattern(

0 commit comments

Comments
 (0)