实现Qt日志功能并输出到文件(qDebug\qWarning\ 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 Creator的环境设置为utf-8后,用qDebug怎么也打印不出中文!

今天无意中居然找到了解决办法:

点击(此处)折叠或打开

  1. QTextCodec*codec=QTextCodec::codecForName("UTF-8");
  2.   
  3. QTextCodec::setCodecForLocale(codec);
  4.   
  5. QTextCodec::setCodecForCStrings(codec);
  6.   
  7. QTextCodec::setCodecForTr(codec);
  8.   
  9. qDebug()<<QTextCodec::codecForName("GB2312")->fromUnicode(QTextCodec::codecForName("UTF-8")->toUnicode("中文显示"));

Qt编码,qDebug重定向到文件
void customMessageHandler(QtMsgType type, const char* msg)
{
   QString txt;
   switch(type)
   {
   case QtDebugMsg:
       txt = QString("Debug: %1").arg(msg);
       break;
   case QtWarningMsg:
       txt = QString("Warning: %1").arg(msg);
       break;
   case QtCriticalMsg:
       txt = QString("Critical: %1").arg(msg);
       break;
   case QtFatalMsg:
       txt = QString("Critical: %1").arg(msg);
       abort();
   }
   QFile outFile("sim.log");
   outFile.open(QIODevice::WriteOnly | QIODevice::Append);
   QTextStream ts( &outFile);
   ts < < txt << endl;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec * gbk = QTextCodec::codecForName("GBK");
    QTextCodec::setCodecForTr(gbk);
    QTextCodec::setCodecForCStrings(gbk);
    QTextCodec::setCodecForLocale(gbk);
    QTextCodec::setCodecForTr(gbk);
    QTextCodec::setCodecForLocale(gbk);
    QTextCodec::setCodecForCStrings(gbk);

    qInstallMsgHandler(customMessageHandler);

    SimulationMainWidget w;
    w.show();

    return a.exec();
}

你可能感兴趣的:(实现Qt日志功能并输出到文件(qDebug\qWarning\ qCritical\qFatal))