6#include <QtCore/qfile.h>
7#include <QtCore/qlibraryinfo.h>
8#include <QtCore/private/qlocking_p.h>
9#include <QtCore/qstandardpaths.h>
10#include <QtCore/qstringtokenizer.h>
11#include <QtCore/qtextstream.h>
12#include <QtCore/qdir.h>
13#include <QtCore/qcoreapplication.h>
15#if QT_CONFIG(settings)
16#include <QtCore/qsettings.h>
17#include <QtCore/private/qsettings_p.h>
22#define debugMsg QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, "qt.core.logging").debug
23#define warnMsg QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, "qt.core.logging").warning
99 if (
pattern.endsWith(
".debug"_L1)) {
102 }
else if (
pattern.endsWith(
".info"_L1)) {
105 }
else if (
pattern.endsWith(
".warning"_L1)) {
108 }
else if (
pattern.endsWith(
".critical"_L1)) {
115 const QChar asterisk = u
'*';
116 if (!
p.contains(asterisk)) {
119 if (
p.endsWith(asterisk)) {
123 if (
p.startsWith(asterisk)) {
127 if (
p.contains(asterisk))
128 flags = PatternFlags();
193 if (m_inRulesSection) {
195 if (equalPos != -1) {
198#if QT_CONFIG(settings)
207 if (valueStr ==
"true"_L1)
209 else if (valueStr ==
"false"_L1)
228 : categoryFilter(defaultCategoryFilter)
230#if defined(Q_OS_ANDROID)
244 static const bool debugEnv = [] {
247 debugMsg(
"QT_LOGGING_DEBUG environment variable is set.");
256 debugMsg(
"Checking \"%s\" for rules",
267 return parser.
rules();
269 return QList<QLoggingRule>();
280 debugMsg(
"Initializing the rules database ...");
281 debugMsg(
"Checking %s environment variable",
"QTLOGGING_CONF");
283 QList<QLoggingRule> er, qr, cr;
286 if (!rulesFilePath.isEmpty())
290 debugMsg(
"Checking %s environment variable",
"QT_LOGGING_RULES");
293 if (!rulesSrc.isEmpty()) {
302 er += parser.
rules();
307#if !defined(QT_BOOTSTRAPPED)
317 if (!envPath.isEmpty())
322 ruleSets[EnvironmentRules] = std::move(er);
323 ruleSets[QtConfigRules] = std::move(qr);
324 ruleSets[ConfigRules] = std::move(cr);
326 if (!ruleSets[EnvironmentRules].isEmpty() || !ruleSets[QtConfigRules].isEmpty() || !ruleSets[ConfigRules].isEmpty())
338 const auto locker = qt_scoped_lock(registryMutex);
345 (*categoryFilter)(cat);
355 const auto locker = qt_scoped_lock(registryMutex);
368 const char *environment)
370 qtCategoryEnvironmentOverrides.insert_or_assign(categoryName, environment);
384 debugMsg(
"Loading logging rules set by QLoggingCategory::setFilterRules ...");
388 ruleSets[ApiRules] = parser.
rules();
399void QLoggingRegistry::updateRules()
402 (*categoryFilter)(*it);
412 const auto locker = qt_scoped_lock(registryMutex);
415 filter = defaultCategoryFilter;
427 return qtLoggingRegistry();
439 Q_ASSERT(reg->categories.contains(cat));
440 QtMsgType enableForLevel = reg->categories.value(cat);
452 if (
const char *categoryName = cat->categoryName()) {
454 if (strcmp(categoryName,
"qt") == 0) {
456 }
else if (strncmp(categoryName,
"qt.", 3) == 0) {
458 auto it = reg->qtCategoryEnvironmentOverrides.
find(categoryName);
459 if (
it == reg->qtCategoryEnvironmentOverrides.
end())
468 for (
const auto &ruleSet : reg->ruleSets) {
469 for (
const auto &
rule : ruleSet) {
472 debug = (filterpass > 0);
475 info = (filterpass > 0);
481 critical = (filterpass > 0);
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
static QString toNativeSeparators(const QString &pathName)
QString absoluteFilePath(const QString &fileName) const
Returns the absolute path name of a file in the directory.
QFILE_MAYBE_NODISCARD bool open(OpenMode flags) override
Opens the file using OpenMode mode, returning true if successful; otherwise false.
static QString decodeName(const QByteArray &localFileName)
This does the reverse of QFile::encodeName() using localFileName.
static QString path(LibraryPath p)
qsizetype size() const noexcept
void append(parameter_type t)
void(* CategoryFilter)(QLoggingCategory *)
This is a typedef for a pointer to a function with the following signature:
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)
int pass(QLatin1StringView categoryName, QtMsgType type) const
void setImplicitRulesSection(bool inRulesSection)
QList< QLoggingRule > rules() const
void setContent(QStringView content)
iterator find(const T &value)
static bool iniUnescapedKey(QByteArrayView key, QString &result)
static QString locate(StandardLocation type, const QString &fileName, LocateOptions options=LocateFile)
constexpr QStringView chopped(qsizetype n) const noexcept
Returns the substring of length size() - length starting at the beginning of this object.
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString left(qsizetype n) const &
qsizetype indexOf(QLatin1StringView s, qsizetype from=0, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
QString chopped(qsizetype n) const &
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString mid(qsizetype position, qsizetype n=-1) const &
qsizetype size() const noexcept
Returns the number of characters in this string.
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
QString trimmed() const &
QByteArray toUtf8() const &
QSet< QString >::iterator it
Combined button and popup list for selecting options.
DBusConnection const char * rule
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
static QList< QLoggingRule > loadRulesFromFile(const QString &filePath)
static bool qtLoggingDebug()
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLsizei GLenum * categories
QDebug warning(QAnyStringView fileName, int lineNumber)
#define QStringLiteral(str)
constexpr auto qTokenize(Haystack &&h, Needle &&n, Flags...flags) noexcept(QtPrivate::Tok::is_nothrow_constructible_from< Haystack, Needle >::value) -> decltype(QtPrivate::Tok::TokenizerResult< Haystack, Needle >{std::forward< Haystack >(h), std::forward< Needle >(n), flags...})
QStringView qToStringViewIgnoringNull(const QStringLike &s) noexcept
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept