Qt应用程序输出日志的方法

本文介绍Qt应用程序输出日志的方法。

Qt应用程序发布后,应用程序有时会出现一些问题,程序运行过程中的信息记录显得尤为重要,这就要求应用程序可以输出日志,通过日志方便我们分析,解决问题。

Qt对日志的输出提供了较好的支持,下面介绍如何在Qt应用程序中输出日志。

1.输出重定向

Qt的qDebug(),qCritical(),qWarning()默认输出是输出到控制台的,也就是我们的调试输出。要想输出到日志文件,就需要对输出重定向,Qt提供了一个回调函数,方便用户按自己的输出格式输出日志。

1)建立"log.h"

#ifndef LOG_H
#define LOG_H

#include 
#include 


#define LOG_FILE    ("log.txt")


void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg);


#endif // LOG_H

2)建立"log.cpp"

#include "log.h"
#include 
#include 
#include 
#include 
#include 


void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QString text;
    QString time;
    QFile file(LOG_FILE);
    static QMutex mutex;

    Q_UNUSED(context)

    mutex.lock();

    file.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream textStream(&file);

    switch(type) {
        case (QtDebugMsg): {text = QString("Debug:"); break;}
        case (QtWarningMsg): {text = QString("Warning:"); break;}
        case (QtCriticalMsg): {text = QString("Critical:"); break;}
        case (QtFatalMsg): {text = QString("Fatal:"); break;}
        default: {break;}
    }

    time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    text = QString("%1%2 %3").arg(text).arg(time).arg(msg);

    textStream << text << "\r\n";

    file.flush();
    file.close();

    mutex.unlock();
}

这里我们定义了1个外部函数,函数内容比较简单,就不细介绍了。

2.安装

定义好用户的消息处理函数后,需要注册到系统中,在"main.cpp"中:

#define APP_DEBUG

int main(int argc, char *argv[])
{
#ifdef APP_DEBUG
    qInstallMessageHandler(nullptr);
#else
    qInstallMessageHandler(messageHandler);
#endif

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    qDebug() << "debug";
    qCritical() << "critical";
    qWarning() << "warning";

    return a.exec();
}

采用qInstallMessageHandler()函数将我们定义的消息处理函数安装进系统,输出就可以到日志文件了。

另外,这里定义了宏"APP_DEBUG",在代码开发过程中定义,可使输出信息到控制台,程序发布时可取消定义,日志输出到日志文件中。

总结,本文介绍了Qt应用程序输出日志的方法。

你可能感兴趣的:(Qt编程,qt)