实现Qt日志功能并输出到文件
生活随笔
收集整理的這篇文章主要介紹了
实现Qt日志功能并输出到文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 實現Qt日志功能并輸出到文件
- 一、基本分類:
- 二、如何截獲這些信息
- 三、將qDebug()\qWarning()\qCritical()\qFatal() 信息輸出到指定文件中
- 四、改寫customMessageHandler函數
實現Qt日志功能并輸出到文件
一、基本分類:
qDebug : 調試信息提示
qWarning: 一般的警告提示
qCritical: 嚴重錯誤提示
二、如何截獲這些信息
Qt提供了qInstallMsgHandler 方法用來定制消息發生后如何來處理。
qInstallMsgHandler 是一個回調函數,主要是由qDebug、qWarnng、qCritical、qFatal這些函數進行觸發,
也就是說,qDeubg這些函數處理的消息文本會被qInstallMsgHandler 所指向的回調函數截獲,這樣就允許用戶自己來處理這些消息文本。
例如,你完全可以將這些消息文本輸出并保存到相關的日志文件中。請看下面的示例!qFatal: 致命錯誤提示
三、將qDebug()\qWarning()\qCritical()\qFatal() 信息輸出到指定文件中
Qt 的官方手冊上提供了示例程序:
#include < QtDebug >#include < QFile >#include < QTextStream >void customMessageHandler(QtMsgType type, const char * msg){QString txt;switch (type) {// 調試信息提示case QtDebugMsg:txt = QString( ” Debug: %1 ” ).arg(msg);break ;// 一般的warning提示case QtWarningMsg:txt = QString( ” Warning: %1 ” ).arg(msg);break ;// 嚴重錯誤提示case QtCriticalMsg:txt = QString( ” Critical: %1 ” ).arg(msg);break ;// 致命錯誤提示case QtFatalMsg:txt = QString( ” Fatal: %1 ” ).arg(msg);abort();}QFile outFile( ” debuglog.txt ” );outFile.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream ts( & outFile);ts << txt << endl;}int main( int argc, char * argv[] ){QApplication app( argc, argv );// 先注冊自己的MsgHandlerqInstallMsgHandler(customMessageHandler); // 以后就可以像下面這樣直接打日志到文件中,而且日志也會包含時間信息qDebug( ” This is a debug message at thisisqt.com ” );qWarning( ” This is a warning message at thisisqt.com ” );qCritical( ” This is a critical message at thisisqt.com ” );qFatal( ” This is a fatal message at thisisqt.com ” );return app.exec();}四、改寫customMessageHandler函數
雖然實現了日志的輸出,但是這些信息都輸出到的同一個文件,對后續問題的查找不方便,可能將不同的類型的日志文件輸出到不同的文件中呢?這就要改寫customMessageHandler函數
#include <qapplication.h> #include <stdio.h> #include <stdlib.h> #include<QMutex> #include<QDateTime> #include<QFile> #include<QTextStream>#include<QFile> #include<qDebug> #include<QMessageBox>/** * @projectName JplocalSense * @brief 摘要 :日志輸出 * 調用格式如下: * qDebug("This is a debug message"); * qWarning("This is a warning message"); * qCritical("This is a critical message"); * qFatal("This is a fatal message"); * * @date 2020-10-30 */const bool bEnableDebugLog = 1 ; //是否啟用日志輸出void WriteLine(QString logFileName, QString logMessage) {QFile file(logFileName);file.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream text_stream(&file);text_stream << logMessage << "\r\n";file.flush();file.close(); }void Log(QString logFileName, QString logMessage) {static QMutex mutex;mutex.lock();if (bEnableDebugLog){WriteLine(logFileName, logMessage);}mutex.unlock(); }void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg) {QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");QString current_date = QString("(%1)").arg(current_date_time);QString message;QString text;QString fileName;switch(type){case QtDebugMsg:text = QString("Debug:");message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);fileName = "logDebug.txt";Log(fileName,message);break;case QtWarningMsg:text = QString("Warning:");message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);fileName = "logWarning.txt";Log(fileName,message);break;case QtCriticalMsg:text = QString("Critical:");message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);fileName = "logCritical.txt";Log(fileName,message);break;case QtFatalMsg:text = QString("Fatal:");message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);fileName = "logFatal.txt";Log(fileName,message);break;} }在main 函數中改寫如下:
//注冊MessageHandler,啟用日志輸出功能
if(bEnableDebugLog){qInstallMessageHandler(outputMessage);}調用如下:
- qDebug("This is a debug message");
- qWarning("This is a warning message");
- qCritical("This is a critical message");
- qFatal("This is a fatal message");
于是,qDebug 的日志會輸出到logDebug.txt ;qWarning的日志會輸出到logWarning.txt;
qCritical的日志會輸出到logCritical.txt;qFatal的日志輸出到logFatal.txt;
總結
以上是生活随笔為你收集整理的实现Qt日志功能并输出到文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 调用C++写的dll的实现方法
- 下一篇: Qt基于QGraphicsObject自