diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2021-09-20 23:07:52 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2021-10-27 12:40:33 -0700 |
commit | 806545fcc8d6b3b96a5191a00a31e9a39837189c (patch) | |
tree | 10ebd91c2936f4c187f24f7e0f154fffec0ed493 | |
parent | 0c0892a3e20aa1fa79e3561de9b8e1fa8820f062 (diff) | |
download | qtbase-806545fcc8d6b3b96a5191a00a31e9a39837189c.tar.gz |
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.cpp | 24 | ||||
-rw-r--r-- | src/corelib/io/qloggingregistry_p.h | 33 |
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 |