文章目录
实现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 );
// 先注册自己的MsgHandler
qInstallMsgHandler(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;