myMessageOutput 自定义日志格式
最后更新于:2022-04-02 02:14:50
[TOC]
## 概述
qInstallMessageHandler 用于注册 QtMessageHandler 的handle
```
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
```
QtMessageHandler 格式为
```
typedef void (*QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &);
```
## 示例
### 输出详细信息
```
// 自定义消息处理程序
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtInfoMsg:
fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
abort();
}
}
```
使用
```
int main(int argc, char *argv[])
{
qInstallMessageHandler(myMessageOutput);
QApplication a(argc, argv);
qDebug()<<"测试"; // Debug: 测试 (../hello3/main.cpp:38, int main(int, char **))
MainWindow w;
w.show();
return a.exec();
}
```
### 详细信息输出到文件
注意 release 版本 没有 上下文消息,需要设置
```
DEFINES += QT_MESSAGELOGCONTEXT
```
```
// 自定义消息处理程序
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
// 加锁
static QMutex mutex;
mutex.lock();
QByteArray localMsg = msg.toLocal8Bit();
QString strMsg("");
switch(type)
{
case QtDebugMsg:
strMsg = QString("Debug");
break;
case QtWarningMsg:
strMsg = QString("Warning");
break;
case QtCriticalMsg:
strMsg = QString("Critical");
break;
case QtFatalMsg:
strMsg = QString("Fatal");
break;
}
// 设置输出信息格式
QString strDateTime = QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss");
QString strMessage = QString("%1 [%2] %3 [%5:%6]")
.arg(strDateTime)
.arg(strMsg)
.arg(localMsg.constData()).
arg(context.file).arg(context.line);
// 输出信息至文件中(读写、追加形式)
// 使用 static 只需要
static QFile file("log123123.txt");
if(!file.isOpen()){
file.open(QIODevice::ReadWrite | QIODevice::Append);
}
QTextStream stream(&file);
stream << strMessage << "\r\n";
file.flush();
// 取消 close
// file.close();
// 解锁
mutex.unlock();
}
```
使用
```
int main(int argc, char *argv[])
{
qInstallMessageHandler(myMessageOutput);
QApplication a(argc, argv);
qDebug()<<"测试"; // Debug: 测试 (../hello3/main.cpp:38, int main(int, char **))
MainWindow w;
w.show();
return a.exec();
}
```
';