实现Qt日志功能并输出到文件

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

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将Qt的工作台输出改到Qt界面输出,可以使用QTextEdit控件来显示输出信息。首先,需要在主窗口类中创建一个QTextEdit对象,用于显示输出信息。然后,使用qInstallMessageHandler函数来自定义消息处理流程,将输出信息重定向到QTextEdit控件中。 在主窗口类的构造函数中,创建一个QTextEdit对象,并设置其属性和大小。然后,使用qInstallMessageHandler函数来设置自定义的消息处理函数。在消息处理函数中,将输出信息追加到QTextEdit控件中。 以下是示例代码: ```cpp // 在主窗口类中定义一个QTextEdit对象 QTextEdit *debugEdit; // 自定义消息处理函数 void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg) { // 根据消息类型设置输出格式 QString output; switch (type) { case QtDebugMsg: output = QString("Debug: %1").arg(msg); break; case QtWarningMsg: output = QString("Warning: %1").arg(msg); break; case QtCriticalMsg: output = QString("Critical: %1").arg(msg); break; case QtFatalMsg: output = QString("Fatal: %1").arg(msg); break; default: break; } // 将输出信息追加到QTextEdit控件中 debugEdit->append(output); } // 在主窗口类的构造函数中设置QTextEdit控件和消息处理函数 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 创建QTextEdit对象 debugEdit = new QTextEdit(); debugEdit->setWindowTitle("调试窗口"); debugEdit->resize(500, 300); debugEdit->setAttribute(Qt::WA_QuitOnClose, false); debugEdit->hide(); // 设置自定义的消息处理函数 qInstallMessageHandler(outputMessage); } ``` 通过以上代码,你可以将Qt的工作台输出改到Qt界面输出,将输出信息显示在QTextEdit控件中。 #### 引用[.reference_title] - *1* *3* [QT 日志输出至控制台、控件、文件](https://blog.csdn.net/weixin_49569127/article/details/123201370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [QT 学习笔记(六)](https://blog.csdn.net/weixin_45891612/article/details/128087543)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值