Qt5 调试日志输出

一 qInstallMessageHandler介绍

QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)

函数作用:装之前定义的Qt消息处理程序;返回指向上一个消息处理程序的指针。

消息处理程序是一个打印调试消息、警告、关键和致命错误消息的函数。Qt库(调试模式)包含数百条警告消息,当出现内部错误(通常是无效的函数参数)时会打印这些消息。Qt内置发布模式也包含此类警告,除非编译期间设置了Qt_NO_WARNING_输出和/或Qt_NO_DEBUG_输出。如果实现自己的消息处理程序,则可以完全控制这些消息。

默认消息处理程序将消息打印到X11下的标准输出或Windows下的调试器。如果是致命消息,应用程序将立即中止。

只能定义一个消息处理程序,因为这通常是在应用程序范围内进行的,以控制调试输出。

要还原消息处理程序,请调用qInstallMessageHandler(0)。

例子1

  #include 
  #include 
  #include 

  void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
  {
      QByteArray localMsg = msg.toLocal8Bit();
      const char *file = context.file ? context.file : "";
      const char *function = context.function ? context.function : "";
      switch (type) {
      case QtDebugMsg:
          fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
          break;
      case QtInfoMsg:
          fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
          break;
      case QtWarningMsg:
          fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
          break;
      case QtCriticalMsg:
          fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
          break;
      case QtFatalMsg:
          fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
          break;
      }
  }

  int main(int argc, char **argv)
  {
      qInstallMessageHandler(myMessageOutput);
      QApplication app(argc, argv);
      ...
      return app.exec();
  }

See also QtMessageHandler, QtMsgType, qDebug(), qInfo(), qWarning(), qCritical(), qFatal(), and Debugging Techniques.

支持多线程,输出到文件

/**
 * @brief customMessageHandler,日志重定向句柄
 * @param type 日志类型,debug等
 * @param context 上下文
 * @param msg 日志信息
 */
void Utils::customMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    QString strMsg("");
    switch (type) {
    case QtDebugMsg:
        strMsg = QString("[Debug]");
        break;
    case QtWarningMsg:
        strMsg = QString("[Warning]");
        break;
    case QtCriticalMsg:
        strMsg = QString("[Critical]");
        break;
    case QtFatalMsg:
        strMsg = QString("[Fatal]");
        break;
    default:
        strMsg = QString("[Debug]");
        break;
    }

    // 设置输出信息格式
    QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
    QString strMessage = strMsg + QString("DateTime:%1 ThreadId:%2 Message:%3 File:%4(%5)")
            .arg(strDateTime).arg(QString::number(quintptr(QThread::currentThreadId()))).arg(localMsg.constData()).arg(context.file).arg(context.line);

    std::cout << strMessage.toUtf8().data() << std::endl;

    // 输出信息至文件中(读写、追加形式)
    QString fileName = m_sysRootPath + PROC_LOG;
    fileName.replace("//", "/");
    QFile file(fileName);
    file.open(QIODevice::ReadWrite | QIODevice::Append);
    QTextStream stream(&file);
    stream << strMessage << endl;
    stream.flush();
    file.close();
}

二 QMessageLogger介绍

QMessageLogger类生成日志消息。

QMessageLogger用于为Qt日志框架生成消息。通常通过qDebug()、qInfo()、qWarning()、qCritical()或qFatal()函数使用它,这些函数实际上是宏:例如qDebug()扩展为QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug()用于调试和 QMessageLogger(0, 0, 0).debug()用于发布版本。

如果想要在调试版本和发布版本都有这些日志的话,可以用自定义的宏替换qDebug()等,如下:

#include 
//输出debug级别日志
#define KyDebug QMessageLogger(__FILE__, __LINE__, __FUNCTION__).debug
//输出info级别日志
#define KyInfo QMessageLogger(__FILE__, __LINE__, __FUNCTION__).info
//输出warning级别日志
#define KyWarning QMessageLogger(__FILE__, __LINE__, __FUNCTION__).warning
//输出critical级别日志
#define KyCritical QMessageLogger(__FILE__, __LINE__, __FUNCTION__).critical
//输出fatal级别日志
#define KyFatal QMessageLogger(__FILE__, __LINE__, __FUNCTION__).fatal

可以结合qInstallMessageHandler一起使用,qInstallMessageHandler的参数QMessageLogContext &context中有__FILE__, __LINE__, __FUNCTION__的副本。

你可能感兴趣的:(Qt,qt)