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// Qt-Security score:significant reason:default
4
5#ifndef QLOGGINGREGISTRY_P_H
6#define QLOGGINGREGISTRY_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists for the convenience
13// of a number of Qt sources files. This header file may change from
14// version to version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtCore/private/qloggingcategory_p.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#define Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(name, env, categoryName)
43 inline namespace QtPrivateLogging {
44 Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName)
45 }
46 Q_WEAK_OVERLOAD
47 Q_DECL_DEPRECATED_X("Logging categories should either be static or declared in a header")
48 const QLoggingCategory &name() { return QtPrivateLogging::name(); }
49
50#define Q_STATIC_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(name, env, categoryName)
51 static Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName)
52
54{
55public:
56 QLoggingRule();
57 QLoggingRule(QStringView pattern, bool enabled);
58 int pass(QLatin1StringView categoryName, QtMsgType type) const;
59
60 enum PatternFlag {
61 FullText = 0x1,
62 LeftFilter = 0x2,
63 RightFilter = 0x4,
64 MidFilter = LeftFilter | RightFilter
65 };
66 Q_DECLARE_FLAGS(PatternFlags, PatternFlag)
67
68 QString category;
69 int messageType = -1;
70 PatternFlags flags;
71 bool enabled = false;
72
73private:
74 void parse(QStringView pattern);
75};
76
77Q_DECLARE_OPERATORS_FOR_FLAGS(QLoggingRule::PatternFlags)
78Q_DECLARE_TYPEINFO(QLoggingRule, Q_RELOCATABLE_TYPE);
79
80class Q_AUTOTEST_EXPORT QLoggingSettingsParser
81{
82public:
83 void setImplicitRulesSection(bool inRulesSection) { m_inRulesSection = inRulesSection; }
84
85 void setContent(QStringView content, char16_t separator = u'\n');
86 void setContent(FILE *stream);
87
88 QList<QLoggingRule> rules() const { return _rules; }
89
90private:
91 void parseNextLine(QStringView line);
92
93private:
94 bool m_inRulesSection = false;
95 QList<QLoggingRule> _rules;
96};
97
99{
101public:
103
104 Q_AUTOTEST_EXPORT void initializeRules();
105
106 void registerCategory(QLoggingCategory *category, QtMsgType enableForLevel);
107 void unregisterCategory(QLoggingCategory *category);
108
109 Q_CORE_EXPORT void registerEnvironmentOverrideForCategory(const char *categoryName,
110 const char *environment);
111
112 void setApiRules(const QString &content);
113
116
117 Q_CORE_EXPORT static QLoggingRegistry *instance();
118
119 static constexpr const char defaultCategoryName[] = "default";
121
122private:
123 Q_AUTOTEST_EXPORT void updateRules();
124 static inline QLoggingRegistry *self = nullptr;
125
126 static void defaultCategoryFilter(QLoggingCategory *category);
127
128 enum RuleSet {
129 // sorted by order in which defaultCategoryFilter considers them:
130 QtConfigRules,
131 ConfigRules,
132 ApiRules,
133 EnvironmentRules,
134
135 NumRuleSets
136 };
137
138 QMutex registryMutex;
139
140 // protected by mutex:
141 QList<QLoggingRule> ruleSets[NumRuleSets];
142 QHash<QLoggingCategory *, QtMsgType> categories;
144 std::map<QByteArrayView, const char *> qtCategoryEnvironmentOverrides;
145
146 friend class ::tst_QLoggingRegistry;
147};
148
150{
151public:
155
156private:
157 static const char *registerOverride(const char *categoryName, const char *environment)
158 {
159 QLoggingRegistry *c = QLoggingRegistry::instance();
160 if (c)
161 c->registerEnvironmentOverrideForCategory(categoryName, environment);
162 return categoryName;
163 }
164};
165
166QT_END_NAMESPACE
167
168#endif // QLOGGINGREGISTRY_P_H
QLoggingCategoryWithEnvironmentOverride(const char *category, const char *env)
static constexpr const char defaultCategoryName[]
void unregisterCategory(QLoggingCategory *category)
Q_CORE_EXPORT void registerEnvironmentOverrideForCategory(const char *categoryName, const char *environment)
static QLoggingCategory * defaultCategory()
Q_AUTOTEST_EXPORT void initializeRules()
void registerCategory(QLoggingCategory *category, QtMsgType enableForLevel)
void setApiRules(const QString &content)
static QT_BEGIN_NAMESPACE constexpr int DefaultLoggingCategoryEnabledValue
#define Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName)