qdebug release和debug的不同实现

开发环境:Win10 Qt5.7.0 VisualStudio2015
核心:qInstallMessageHandler函数
官方文档:http://doc.qt.io/qt-5/qtglobal.html#qInstallMessageHandler
Qt可将qDebug()输出的信息(其他信息),进行额外处理
最常见的用法,是将输出信息保存到txt文本文件中,可做发布后日志功能

范例(在Release模式下,qDebug()输出的调试信息保存至软件根目录下*.lgt文件中)

  1. #include <QApplication>  
  2. #include <iostream>  
  3. #include <cstdlib>  
  4. #include <QFile>  
  5. #include <QString>  
  6. #include <QTextStream>  
  7. #include <QMutex>  
  8. #include <QDateTime>  
  9. using namespace std;  
  10.   
  11. QMutex mutex;//日志代码互斥锁  
  12. QString timePoint;  
  13.   
  14. //日志生成  
  15. void LogMsgOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)  
  16.  {     
  17.      mutex.lock();  
  18.      cout << msg.toStdString() << endl;  
  19.      //Critical Resource of Code  
  20.      QByteArray localMsg = msg.toLocal8Bit();  
  21.      QString log;  
  22.        
  23.      switch (type) {  
  24.      case QtDebugMsg:  
  25.          //fprintf(stderr, “Debug: %s (%s:%u, %s)\n”, localMsg.constData(), context.file, context.line, context.function);  
  26.          log.append(QString(”Debug  File:%1 %2  Line:%3  Content:%4”).arg(context.file).arg(context.function).arg(context.line).arg(msg));  
  27.          break;  
  28.      case QtInfoMsg:  
  29.          //fprintf(stderr, “Info: %s (%s:%u, %s)\n”, localMsg.constData(), context.file, context.line, context.function);  
  30.          log.append(QString(”Info: %1  %2  %3  %4”).arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));  
  31.          break;  
  32.      case QtWarningMsg:  
  33.          //fprintf(stderr, “Warning: %s (%s:%u, %s)\n”, localMsg.constData(), context.file, context.line, context.function);  
  34.          log.append(QString(”Warning: %1  %2  %3  %4”).arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));  
  35.          break;  
  36.      case QtCriticalMsg:  
  37.          //fprintf(stderr, “Critical: %s (%s:%u, %s)\n”, localMsg.constData(), context.file, context.line, context.function);  
  38.          log.append(QString(”Critical: %1  %2  %3  %4”).arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));  
  39.          break;  
  40.      case QtFatalMsg:  
  41.          //fprintf(stderr, “Fatal: %s (%s:%u, %s)\n”, localMsg.constData(), context.file, context.line, context.function);  
  42.          log.append(QString(”Fatal: %1  %2  %3  %4”).arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));  
  43.          abort();  
  44.      }  
  45.        
  46.      QFile file;  
  47.      QString path = QString(”log%1.lgt”).arg(timePoint);  
  48.      file.setFileName(path);  
  49.      if (!file.open(QIODevice::ReadWrite | QIODevice::Append))  
  50.      {  
  51.          QString erinfo = file.errorString();  
  52.          cout << erinfo.toStdString() << endl;  
  53.          return;  
  54.      }  
  55.      QTextStream out(&file);  
  56.      out << ”\n\r” << log;  
  57.      file.close();  
  58.   
  59.      mutex.unlock();  
  60.  }  
  61.   
  62. int main(int argc, char *argv[])  
  63. {  
  64.     //release模式下,调试信息输出至日志文件  
  65. #ifndef _DEBUG  
  66.     timePoint = QDateTime::currentDateTime().toString(”yyyyMMddHHmmss”);  
  67.     qInstallMessageHandler(LogMsgOutput);  
  68. #endif  
  69.     QApplication a(argc, argv);  
  70.     Widget w;  
  71.     w.show();  
  72.   
  73.     return a.exec();  
  74. }  
阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页