QLoggingRegistry: Look up logging configuration in Qt data path
authorKai Koehne <kai.koehne@theqtcompany.com>
Fri, 19 Jun 2015 11:38:58 +0000 (13:38 +0200)
committerKai Koehne <kai.koehne@theqtcompany.com>
Mon, 24 Aug 2015 07:17:29 +0000 (07:17 +0000)
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 <alexander.blasche@theqtcompany.com>
src/corelib/io/qloggingcategory.cpp
src/corelib/io/qloggingregistry.cpp
src/corelib/io/qloggingregistry_p.h

index 1d06e2a912d432a56fa6a59ee52516a525ef277d..b51085ef4251bab1f8468787a1026d9ec9118b70 100644 (file)
@@ -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
index f0b72cd9be5aeb693b31ec97410d8ae0dbab324f..b53e25110294979e6934836efceb9c3cb48432e3 100644 (file)
@@ -34,6 +34,7 @@
 #include "qloggingregistry_p.h"
 
 #include <QtCore/qfile.h>
+#include <QtCore/qlibraryinfo.h>
 #include <QtCore/qstandardpaths.h>
 #include <QtCore/qtextstream.h>
 #include <QtCore/qdir.h>
@@ -247,6 +248,21 @@ static bool qtLoggingDebug()
     return debugEnv;
 }
 
+static QVector<QLoggingRule> 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<QLoggingRule>();
+}
+
 /*!
     \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 !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() || !configRules.isEmpty()) {
+    if (!envRules.isEmpty() || !qtConfigRules.isEmpty() || !configRules.isEmpty()) {
         QMutexLocker locker(&registryMutex);
         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);
index 718e09d9bba55734ca9954b208f854c0efb8c190..bb32a4996dead2bab064965d1eefbfdac1f49ed5 100644 (file)
@@ -122,6 +122,7 @@ private:
 
     QMutex registryMutex;
 
+    QVector<QLoggingRule> qtConfigRules;
     QVector<QLoggingRule> configRules;
     QVector<QLoggingRule> envRules;
     QVector<QLoggingRule> apiRules;