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(); } ```
';