一、qt源码格式化日志 关键内部类 QMessagePattern
qt为 格式化打印日志 提供了一个简易的 pattern(模式/格式) 词法解析的简易的内部类QMessagePattern,作用是获取和解析自定义的日志格式信息。
该类在qt的专门精心日志操作的源码文件Src\qtbase\src\corelib\global\qlogging.cpp 中定义
该类在构造函数中可以直接从 环境变量 QT_MESSAGE_PATTERN 中获取写有 pattern(格式/模式) 信息的字符串(qt现有的pattern的词法比较简易),然后通过setPattern()进行词法解析,得到自定义pattern的格式信息。
也可以通过qSetMessagePattern(const QString &pattern)对static的QMessagePattern对象进行设置。下面是qSetMessagePattern()的源码。可以看到如果是从环境变量值设置了pattern是无法进行修改的。
//D:\Qt\Qt5.12.0\5.12.0\Src\qtbase\src\corelib\global\qlogging.cpp.......
//通过下面这个宏,定义了一个static 的QMessagePattern对象,并通过qMessagePattern()函数返回。
//用函数形式来调用 可以达到第一次调用即初始化的目的
Q_GLOBAL_STATIC(QMessagePattern, qMessagePattern)
..........//对static的QMessagePattern对象设置新的pattern。如果原来的pattern是从环境变量中获取的,
//则无法设置。
void qSetMessagePattern(const QString &pattern)
{QMutexLocker lock(&QMessagePattern::mutex);if (!qMessagePattern()->fromEnvironment)qMessagePattern()->setPattern(pattern);
}
对这个简易的词法解析源码有兴趣,可以到qlogging.cpp中查阅。
简单案例
#include <QDebug>int main(int argc, char *argv[])
{QString pattern="%{file}:%{function}:%{line}:%{message}";qSetMessagePattern(pattern); //设置输出信息的格式qDebug()<<"test"<<endl;ret