实现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;

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐