Qt 调试信息重定向到本地文件

1、 在Qt软件开发过程中,我们经常使用qDebug()输出一些调试信息在QtCreator终端上。

但若将软件编译、生成、打包为一个完整的可运行的程序并安装在系统中后,系统中没有QtCreator和编译环境,那应用程序出现问题,如何输出信息排查呢?

**2、**一个好方法就是Qt调试信息重定向本地文件,即仍然使用qDebug()等函数,但设置后调试信息不输出在终端上,而是输出到指定路径的日志文件中,这样我们就可以通过日志进行调试。

3、 Qt提供了5个全局信息输出函数,对应不同级别:

(1)、qDebug(): 调试信息。

(2)、qInfo(): 普通信息。

(3)、qWarning(): 警告信息。

(4)、qCritical(): 关键错误和系统错误信息。

(5)、qFatal(): 致命错误信息,如果运行qFatal(),应用程序会立即终止。

**4、**Qt调试信息重定向本地文件,只要实现消息处理函数,然后通过qInstallMessageHandler重定义,就可以将调试信息输出到指定路径的文件中了。

**5、**示例: (main.cpp, 其它文件略)

cpp 复制代码
//main.cpp

#include "widget.h"
#include <QApplication>
#include <QMutex>
#include <QDateTime>
#include <QFile>
#include <QDebug>


static QMutex mutex;
void MyLog(QtMsgType type, const QMessageLogContext & context, const QString & message)
{
    mutex.lock();

    QString strType;
    switch (type) {
    case QtDebugMsg:
        strType = "Debug";
        break;
    case QtInfoMsg:
        strType = "Info";
        break;
    case QtWarningMsg:
        strType = "Warning";
        break;
    case QtCriticalMsg:
        strType = "Critical";
        break;
    default:
        break;
    }

    QString strFile = context.file;
    QString strLine = QString::number(context.line);
    QString strFunc = context.function;
    QString strTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");

    QString strLog = QString("[%1][%2][%3][%4][%5]%6.").arg(strType).arg(strFile).arg(strLine).arg(strFunc).arg(strTime).arg(message);

    QString strFileName = QString("App_%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMdd"));
    QFile file(strFileName);
    file.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream stream(&file);
    stream << strLog << "\r\n";
    file.flush();
    file.close();

    mutex.unlock();
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    qInstallMessageHandler(MyLog);

    qDebug() << "This is Debug";
    qInfo() << "This is Info";
    qWarning() << "This is Warning";
    qCritical() << "This is Critical";

    Widget w;
    w.show();

    return a.exec();
}

//运行结果,在exe同级目录下有一个如App_20250425.log文件,里面包含各种输出信息。

Debug..\\..\\main.cpp57int __cdecl main(int,char \*\[)]2025-04-25 16:55:49This is Debug.

Info..\\..\\main.cpp58int __cdecl main(int,char \*\[)]2025-04-25 16:55:49This is Info.

Warning..\\..\\main.cpp59int __cdecl main(int,char \*\[)]2025-04-25 16:55:49This is Warning.

Critical..\\..\\main.cpp60int __cdecl main(int,char \*\[)]2025-04-25 16:55:49This is Critical.

Debug..\\..\\main.cpp57int __cdecl main(int,char \*\[)]2025-04-25 16:56:51This is Debug.

Info..\\..\\main.cpp58int __cdecl main(int,char \*\[)]2025-04-25 16:56:51This is Info.

Warning..\\..\\main.cpp59int __cdecl main(int,char \*\[)]2025-04-25 16:56:51This is Warning.

Critical..\\..\\main.cpp60int __cdecl main(int,char \*\[)]2025-04-25 16:56:51This is Critical.

相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript