summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2021-09-20 23:07:52 -0700
committerThiago Macieira <thiago.macieira@intel.com>2021-10-27 12:40:33 -0700
commit806545fcc8d6b3b96a5191a00a31e9a39837189c (patch)
tree10ebd91c2936f4c187f24f7e0f154fffec0ed493
parent0c0892a3e20aa1fa79e3561de9b8e1fa8820f062 (diff)
QLoggingRegistry: add the ability to have environment variable overrides
Quite a lot of our code in Qt predating QLoggingCategory has manual environment variable controls. For compatibility with established documentation and tips-and-tricks out there, we should keep them working when switching to categorized logging. Change-Id: I3eb1bd30e0124f89a052fffd16a6c151d3e9d552 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r--src/corelib/io/qloggingregistry.cpp24
-rw-r--r--src/corelib/io/qloggingregistry_p.h33
2 files changed, 56 insertions, 1 deletions
diff --git a/src/corelib/io/qloggingregistry.cpp b/src/corelib/io/qloggingregistry.cpp
index 08818c89d7..1c26e3d1c1 100644
--- a/src/corelib/io/qloggingregistry.cpp
+++ b/src/corelib/io/qloggingregistry.cpp
@@ -371,6 +371,20 @@ void QLoggingRegistry::unregisterCategory(QLoggingCategory *cat)
}
/*!
+ \since 6.3
+ \internal
+
+ Registers the environment variable \a environment as the control variable
+ for enabling debugging by default for category \a categoryName. The
+ category name must start with "qt."
+*/
+void QLoggingRegistry::registerEnvironmentOverrideForCategory(QByteArrayView categoryName,
+ QByteArrayView environment)
+{
+ qtCategoryEnvironmentOverrides.insert(categoryName, environment);
+}
+
+/*!
\internal
Installs logging rules as specified in \a content.
*/
@@ -451,8 +465,16 @@ void QLoggingRegistry::defaultCategoryFilter(QLoggingCategory *cat)
// qt.debug=false
if (const char *categoryName = cat->categoryName()) {
// == "qt" or startsWith("qt.")
- if (strcmp(categoryName, "qt") == 0 || strncmp(categoryName, "qt.", 3) == 0)
+ if (strcmp(categoryName, "qt") == 0) {
debug = false;
+ } else if (strncmp(categoryName, "qt.", 3) == 0) {
+ // may be overridden
+ auto it = reg->qtCategoryEnvironmentOverrides.find(categoryName);
+ if (it == reg->qtCategoryEnvironmentOverrides.end())
+ debug = false;
+ else
+ debug = qEnvironmentVariableIntValue(it.value().data());
+ }
}
const auto categoryName = QLatin1String(cat->categoryName());
diff --git a/src/corelib/io/qloggingregistry_p.h b/src/corelib/io/qloggingregistry_p.h
index e8a94a030a..0009d8d2ea 100644
--- a/src/corelib/io/qloggingregistry_p.h
+++ b/src/corelib/io/qloggingregistry_p.h
@@ -63,6 +63,16 @@ class tst_QLoggingRegistry;
QT_BEGIN_NAMESPACE
+#define Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(name, env, categoryName) \
+ const QLoggingCategory &name() \
+ { \
+ static constexpr char cname[] = categoryName; \
+ static_assert(cname[0] == 'q' && cname[1] == 't' && cname[2] == '.' \
+ && cname[4] != '\0', "Category name must start with 'qt.'"); \
+ static const QLoggingCategoryWithEnvironmentOverride category(cname, env); \
+ return category; \
+ }
+
class Q_AUTOTEST_EXPORT QLoggingRule
{
public:
@@ -118,6 +128,11 @@ public:
void registerCategory(QLoggingCategory *category, QtMsgType enableForLevel);
void unregisterCategory(QLoggingCategory *category);
+#ifndef QT_BUILD_INTERNAL
+ Q_CORE_EXPORT // always export from QtCore
+#endif
+ void registerEnvironmentOverrideForCategory(QByteArrayView categoryName, QByteArrayView environment);
+
void setApiRules(const QString &content);
QLoggingCategory::CategoryFilter
@@ -146,10 +161,28 @@ private:
QList<QLoggingRule> ruleSets[NumRuleSets];
QHash<QLoggingCategory *, QtMsgType> categories;
QLoggingCategory::CategoryFilter categoryFilter;
+ QMap<QByteArrayView, QByteArrayView> qtCategoryEnvironmentOverrides;
friend class ::tst_QLoggingRegistry;
};
+class QLoggingCategoryWithEnvironmentOverride : public QLoggingCategory
+{
+public:
+ QLoggingCategoryWithEnvironmentOverride(const char *category, const char *env)
+ : QLoggingCategory(registerOverride(category, env), QtInfoMsg)
+ {}
+
+private:
+ static const char *registerOverride(QByteArrayView categoryName, QByteArrayView environment)
+ {
+ QLoggingRegistry *c = QLoggingRegistry::instance();
+ if (c)
+ c->registerEnvironmentOverrideForCategory(categoryName, environment);
+ return categoryName.data();
+ }
+};
+
QT_END_NAMESPACE
#endif // QLOGGINGREGISTRY_P_H