zoukankan      html  css  js  c++  java
  • Qt 日志功能(qDebug、qWarnng、qCritical、qFatal)

    一、基本分类:
    qDebug : 调试信息提示
    qWarning: 一般的警告提示
    qCritical: 严重错误提示
    qFatal: 致命错误提示


    二、如何截获这些信息
    Qt提供了qInstallMsgHandler 方法用来定制消息发生后如何来处理。
    qInstallMsgHandler 是一个回调函数,主要是由qDebug、qWarnng、qCritical、qFatal这些函数进行触发,
    也就是说,qDeubg这些函数处理的消息文本会被qInstallMsgHandler 所指向的回调函数截获,这样就允许用户自己来处理这些消息文本。
    例如,你完全可以将这些消息文本输出并保存到相关的日志文件中。请看下面的示例!


    三、将qDebug()qWarning()qCritical()qFatal() 信息输出到指定文件中

     1 #include <QtDebug>
     2 #include <QFile>
     3 #include <QTextStream>
     4 
     5 void customMessageHandler(QtMsgType type, const char *msg)
     6 {
     7         QString txt;
     8         switch (type) {
     9         //调试信息提示
    10         case QtDebugMsg:
    11                 txt = QString("Debug: %1").arg(msg);
    12                 break;
    13 
    14         //一般的warning提示
    15         case QtWarningMsg:
    16                 txt = QString("Warning: %1").arg(msg);
    17         break;
    18         //严重错误提示
    19         case QtCriticalMsg:
    20                 txt = QString("Critical: %1").arg(msg);
    21         break;
    22         //致命错误提示
    23         case QtFatalMsg:
    24                 txt = QString("Fatal: %1").arg(msg);
    25                 abort();
    26         }
    27 
    28         QFile outFile("debuglog.txt");
    29         outFile.open(QIODevice::WriteOnly | QIODevice::Append);
    30         QTextStream ts(&outFile);
    31         ts << txt << endl;
    32 }
    33 
    34 int main( int argc, char * argv[] )
    35 {
    36         QApplication app( argc, argv );
    37 
    38         //先注册自己的MsgHandler
    39         qInstallMsgHandler(customMessageHandler);
    40         
    41         //以后就可以像下面这样直接打日志到文件中,而且日志也会包含时间信息
    42         qDebug("This is a debug message at thisisqt.com");
    43         qWarning("This is a warning message at thisisqt.com");
    44         qCritical("This is a critical message at thisisqt.com");
    45         qFatal("This is a fatal message at thisisqt.com");
    46 
    47         return app.exec();
    48 }

    四、如何取消信息处理呢?
    简单:
    还是用qInstallMsgHandler.
    只要执行qInstallMsgHandler(0) 就可以了

    #########################################################################
    在Qt开发过程当中经常使用qDebug等一些输出来调试程序,但是到了正式发布的时候,都会被注释或者删除,采用日志输出来代替。
        做过项目的童鞋可能都使用过日志功能,以便有异常错误能够快速跟踪、定位,Qt也提供的类似的机制。之前用Qt4做项目时使用的是Qt::qInstallMsgHandler(),到了Qt5,使用了新的Qt::qInstallMessageHandler()来替代,详情请查看Qt助手(C++ API changes)。

    描述
        助手中在C++ API changes中提到:Qt::qDebug()、Qt::qWarning()、Qt::qCritical()、Qt::qFatal()被改变为宏来跟踪源代码的消息来源。被打印的信息可以被配置(用于缺省消息处理程序),通过设置该新的环境变量QT_MESSAGE_PATTERN。Qt::qInstallMsgHandler()已过时,因此建议使用Qt::qInstallMessageHandler()来代替。

    级别
    qDebug:调试信息
    qWarning:警告信息
    qCritical:严重错误
    qFatal:致命错误

    实例

     需求(目的):
    生成log.txt日志文件,记录详细日志信息(包括等级、描述信息、产生时间等),以便于快速跟踪、定位。

     1 void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
     2 {
     3     QString text;
     4     switch(type)
     5     {
     6         case QtDebugMsg:
     7             text = QString("Debug:");
     8             break;
     9 
    10         case QtWarningMsg:
    11             text = QString("Warning:");
    12             break;
    13 
    14         case QtCriticalMsg:
    15             text = QString("Critical:");
    16             break;
    17 
    18         case QtFatalMsg:
    19             text = QString("Fatal:");
    20     }
    21     QDateTime current_date_time = QDateTime::currentDateTime();
    22     QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
    23     QString message = text.append(msg).append("(").append(current_date).append(")");
    24 
    25     QFile file("log.txt");
    26     file.open(QIODevice::WriteOnly | QIODevice::Append);
    27     QTextStream text_stream(&file);
    28     text_stream<<message<<"
    ";
    29     file.close();
    30 }
    31 
    32 int main(int argc, char *argv[])
    33 {
    34     QApplication app(argc, argv);
    35 
    36     //注册MessageHandler
    37     qInstallMessageHandler(outputMessage);
    38 
    39     //打印日志到文件中
    40     qDebug("This is a debug message");
    41     qWarning("This is a warning message");
    42     qCritical("This is a critical message");
    43     qFatal("This is a fatal message");
    44 
    45     return app.exec();
    46 }
  • 相关阅读:
    Python 压缩图片至指定大小
    nginx 服务器自签https协议 (Let’s Encrypt)
    Django 批量创建app
    常见的设计模式(python )———适配器模式
    带你完全理解Python中的metaclass,type,class之间的恩怨情仇...
    常见的设计模式(python)———单例模式(转载)
    常见的设计模式(python)———工厂模式
    常见的设计模型(python)——建造者模型
    Django-restframework 概述及目录
    Java多线程开发
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14681545.html
Copyright © 2011-2022 走看看