From cb6ab056480e39ed347d5a75e4b1b1f34443148c Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 19 Jun 2015 13:38:58 +0200 Subject: [PATCH] QLoggingRegistry: Look up logging configuration in Qt data path Distributions like Fedora would like to disable logging globally, without having to patch Qt. Fedora right now therefore adds a /etc/xdg/qtlogging.ini file, which unfortunately though also messes with Qt versions compiled by the user. This patch lets QLoggingRegistry look up logging configurations also in QLibraryInfo::DataPath, which would allow to tweak the values per Qt installation. See also https://bugzilla.redhat.com/show_bug.cgi?id=1227295 Change-Id: I0fca304a47f45739d0c08a9e4e715673bf10aa80 Reviewed-by: Alex Blasche --- src/corelib/io/qloggingcategory.cpp | 1 + src/corelib/io/qloggingregistry.cpp | 64 ++++++++++++++++------------- src/corelib/io/qloggingregistry_p.h | 1 + 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/corelib/io/qloggingcategory.cpp b/src/corelib/io/qloggingcategory.cpp index 1d06e2a912d..b51085ef425 100644 --- a/src/corelib/io/qloggingcategory.cpp +++ b/src/corelib/io/qloggingcategory.cpp @@ -157,6 +157,7 @@ static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift) Order of evaluation: \list + \li [QLibraryInfo::DataPath]/qtlogging.ini \li QtProject/qtlogging.ini \li \l setFilterRules() \li \c QT_LOGGING_CONF diff --git a/src/corelib/io/qloggingregistry.cpp b/src/corelib/io/qloggingregistry.cpp index f0b72cd9be5..b53e2511029 100644 --- a/src/corelib/io/qloggingregistry.cpp +++ b/src/corelib/io/qloggingregistry.cpp @@ -34,6 +34,7 @@ #include "qloggingregistry_p.h" #include +#include #include #include #include @@ -247,6 +248,21 @@ static bool qtLoggingDebug() return debugEnv; } +static QVector loadRulesFromFile(const QString &filePath) +{ + QFile file(filePath); + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + if (qtLoggingDebug()) + debugMsg("Loading \"%s\" ...", + QDir::toNativeSeparators(file.fileName()).toUtf8().constData()); + QTextStream stream(&file); + QLoggingSettingsParser parser; + parser.setContent(stream); + return parser.rules(); + } + return QVector(); +} + /*! \internal Initializes the rules database by loading @@ -256,18 +272,9 @@ void QLoggingRegistry::init() { // get rules from environment const QByteArray rulesFilePath = qgetenv("QT_LOGGING_CONF"); - if (!rulesFilePath.isEmpty()) { - QFile file(QFile::decodeName(rulesFilePath)); - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - if (qtLoggingDebug()) - debugMsg("Loading \"%s\" ...", - QDir::toNativeSeparators(file.fileName()).toUtf8().constData()); - QTextStream stream(&file); - QLoggingSettingsParser parser; - parser.setContent(stream); - envRules = parser.rules(); - } - } + if (!rulesFilePath.isEmpty()) + envRules = loadRulesFromFile(QFile::decodeName(rulesFilePath)); + const QByteArray rulesSrc = qgetenv("QT_LOGGING_RULES").replace(';', '\n'); if (!rulesSrc.isEmpty()) { QTextStream stream(rulesSrc); @@ -277,23 +284,22 @@ void QLoggingRegistry::init() envRules += parser.rules(); } - // get rules from qt configuration - QString envPath = QStandardPaths::locate(QStandardPaths::GenericConfigLocation, - QStringLiteral("QtProject/qtlogging.ini")); - if (!envPath.isEmpty()) { - QFile file(envPath); - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - if (qtLoggingDebug()) - debugMsg("Loading \"%s\" ...", - QDir::toNativeSeparators(envPath).toUtf8().constData()); - QTextStream stream(&file); - QLoggingSettingsParser parser; - parser.setContent(stream); - configRules = parser.rules(); - } - } + const QString configFileName = QStringLiteral("qtlogging.ini"); - if (!envRules.isEmpty() || !configRules.isEmpty()) { +#if !defined(QT_BOOTSTRAPPED) + // get rules from Qt data configuration path + const QString qtConfigPath + = QDir(QLibraryInfo::location(QLibraryInfo::DataPath)).absoluteFilePath(configFileName); + qtConfigRules = loadRulesFromFile(qtConfigPath); +#endif + + // get rules from user's/system configuration + const QString envPath = QStandardPaths::locate(QStandardPaths::GenericConfigLocation, + QString::fromLatin1("QtProject/") + configFileName); + if (!envPath.isEmpty()) + configRules = loadRulesFromFile(envPath); + + if (!envRules.isEmpty() || !qtConfigRules.isEmpty() || !configRules.isEmpty()) { QMutexLocker locker(®istryMutex); updateRules(); } @@ -356,7 +362,7 @@ void QLoggingRegistry::updateRules() if (categoryFilter != defaultCategoryFilter) return; - rules = configRules + apiRules + envRules; + rules = qtConfigRules + configRules + apiRules + envRules; foreach (QLoggingCategory *cat, categories.keys()) (*categoryFilter)(cat); diff --git a/src/corelib/io/qloggingregistry_p.h b/src/corelib/io/qloggingregistry_p.h index 718e09d9bba..bb32a4996de 100644 --- a/src/corelib/io/qloggingregistry_p.h +++ b/src/corelib/io/qloggingregistry_p.h @@ -122,6 +122,7 @@ private: QMutex registryMutex; + QVector qtConfigRules; QVector configRules; QVector envRules; QVector apiRules;