Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qloggingregistry_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QLOGGINGREGISTRY_P_H
5#define QLOGGINGREGISTRY_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists for the convenience
12// of a number of Qt sources files. This header file may change from
13// version to version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/private/qglobal_p.h>
19#include <QtCore/qloggingcategory.h>
20#include <QtCore/qlist.h>
21#include <QtCore/qhash.h>
22#include <QtCore/qmutex.h>
23#include <QtCore/qstring.h>
24#include <QtCore/qtextstream.h>
25
26#include <map>
27
28class tst_QLoggingRegistry;
29
31
32#define Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName)
33 const QLoggingCategory &name()
34 {
35 static constexpr char cname[] = categoryName;
36 static_assert(cname[0] == 'q' && cname[1] == 't' && cname[2] == '.'
37 && cname[4] != '\0', "Category name must start with 'qt.'");
38 static const QLoggingCategoryWithEnvironmentOverride category(cname, env);
39 return category;
40 }
41
42#if defined(Q_CC_GNU_ONLY) && Q_CC_GNU < 1000
43// GCC <10 thinks the "using" declaration from QT_DECLARE_EXPORTED_QT_LOGGING_CATEGORY
44// or Q_DECLARE_LOGGING_CATEGORY conflicts with any weak overload created as part of the definition.
45// So let's make it happy and repeat the "using" instead.
46#define Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(name, env, categoryName)
47 namespace QtPrivateLogging {
48 Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName)
49 }
50 using QtPrivateLogging::name;
51#else
52#define Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(name, env, categoryName)
53 namespace QtPrivateLogging {
54 Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName)
55 }
56 Q_WEAK_OVERLOAD
57 Q_DECL_DEPRECATED_X("Logging categories should either be static or declared in a header")
58 const QLoggingCategory &name() { return QtPrivateLogging::name(); }
59#endif
60
61#define Q_STATIC_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(name, env, categoryName)
62 static Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName)
63
65{
66public:
67 QLoggingRule();
68 QLoggingRule(QStringView pattern, bool enabled);
69 int pass(QLatin1StringView categoryName, QtMsgType type) const;
70
71 enum PatternFlag {
72 FullText = 0x1,
73 LeftFilter = 0x2,
74 RightFilter = 0x4,
75 MidFilter = LeftFilter | RightFilter
76 };
77 Q_DECLARE_FLAGS(PatternFlags, PatternFlag)
78
79 QString category;
80 int messageType = -1;
81 PatternFlags flags;
82 bool enabled = false;
83
84private:
85 void parse(QStringView pattern);
86};
87
88Q_DECLARE_OPERATORS_FOR_FLAGS(QLoggingRule::PatternFlags)
89Q_DECLARE_TYPEINFO(QLoggingRule, Q_RELOCATABLE_TYPE);
90
91class Q_AUTOTEST_EXPORT QLoggingSettingsParser
92{
93public:
94 void setImplicitRulesSection(bool inRulesSection) { m_inRulesSection = inRulesSection; }
95
96 void setContent(QStringView content);
97 void setContent(QTextStream &stream);
98
99 QList<QLoggingRule> rules() const { return _rules; }
100
101private:
102 void parseNextLine(QStringView line);
103
104private:
105 bool m_inRulesSection = false;
106 QList<QLoggingRule> _rules;
107};
108
109class Q_AUTOTEST_EXPORT QLoggingRegistry
110{
111 Q_DISABLE_COPY_MOVE(QLoggingRegistry)
112public:
113 QLoggingRegistry();
114
115 void initializeRules();
116
117 void registerCategory(QLoggingCategory *category, QtMsgType enableForLevel);
118 void unregisterCategory(QLoggingCategory *category);
119
120#ifndef QT_BUILD_INTERNAL
121 Q_CORE_EXPORT // always export from QtCore
122#endif
123 void registerEnvironmentOverrideForCategory(const char *categoryName, const char *environment);
124
125 void setApiRules(const QString &content);
126
128 installFilter(QLoggingCategory::CategoryFilter filter);
129
130 static QLoggingRegistry *instance();
131
132private:
133 void updateRules();
134
135 static void defaultCategoryFilter(QLoggingCategory *category);
136
137 enum RuleSet {
138 // sorted by order in which defaultCategoryFilter considers them:
139 QtConfigRules,
140 ConfigRules,
141 ApiRules,
142 EnvironmentRules,
143
144 NumRuleSets
145 };
146
147 QMutex registryMutex;
148
149 // protected by mutex:
150 QList<QLoggingRule> ruleSets[NumRuleSets];
151 QHash<QLoggingCategory *, QtMsgType> categories;
152 QLoggingCategory::CategoryFilter categoryFilter;
153 std::map<QByteArrayView, const char *> qtCategoryEnvironmentOverrides;
154
155 friend class ::tst_QLoggingRegistry;
156};
157
159{
160public:
164
165private:
166 static const char *registerOverride(const char *categoryName, const char *environment)
167 {
168 QLoggingRegistry *c = QLoggingRegistry::instance();
169 if (c)
170 c->registerEnvironmentOverrideForCategory(categoryName, environment);
171 return categoryName;
172 }
173};
174
175QT_END_NAMESPACE
176
177#endif // QLOGGINGREGISTRY_P_H
QLoggingCategoryWithEnvironmentOverride(const char *category, const char *env)
void unregisterCategory(QLoggingCategory *category)
static QLoggingRegistry * instance()
Q_CORE_EXPORT void registerEnvironmentOverrideForCategory(const char *categoryName, const char *environment)
void registerCategory(QLoggingCategory *category, QtMsgType enableForLevel)
QLoggingCategory::CategoryFilter installFilter(QLoggingCategory::CategoryFilter filter)
void setApiRules(const QString &content)
Combined button and popup list for selecting options.
Q_GLOBAL_STATIC(DefaultRoleNames, qDefaultRoleNames, { { Qt::DisplayRole, "display" }, { Qt::DecorationRole, "decoration" }, { Qt::EditRole, "edit" }, { Qt::ToolTipRole, "toolTip" }, { Qt::StatusTipRole, "statusTip" }, { Qt::WhatsThisRole, "whatsThis" }, }) const QHash< int
QT_BEGIN_NAMESPACE const char qtDefaultCategoryName[]
#define Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName)