Qt安装消息处理qInstallMessageHandler输出详细日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Qt安装消息处理qInstallMessageHandler输出详细日志

qInstallMessageHandler方法介绍

安装前面定义的Qt消息处理程序。返回指向上一个消息处理程序的指针。


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


默认消息处理程序将消息打印到X11下的标准输出或Windows下的调试器。如果是致命消息,则应用程序在处理该消息后立即中止。自定义消息处理程序不应试图自行退出应用程序。


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


需要恢复消息处理程序,请调用qInstallMessageHandler(0)。


官方例子

 #include <stdio.h>
 #include <stdlib.h>
 #include <QCoreApplication>
 #include <QDateTime>
 #include <QFile>
 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[])
{
    QCoreApplication a(argc, argv);
    // 安装消息处理程序
    qInstallMessageHandler(myMessageOutput);
    // 打印信息
    qDebug("This is a debug message.");
    qWarning("This is a warning message.");
    qCritical("This is a critical message.");
    qFatal("This is a fatal message.");
    return a.exec();
}

输出

可以看到,本来只有文本的内容,这里已经多了函数名称、行号·、文件名称。我们可以对日志的输出做一个消息处理。输出一些我们认为重要的信息。

Debug: This is a debug message. (main.cpp:78, int main(int, char**))
Warning: This is a warning message. (main.cpp:79, int main(int, char**))
Critical: This is a critical message. (main.cpp:80, int main(int, char**))
Fatal: This is a fatal message. (main.cpp:81, int main(int, char**))
Press <RETURN> to close this window...


输出日志文件

我们只需要对官方提供的例子稍作改造,由原本的输出,改为写入文件即可。

修改官方例子

// 自定义消息处理程序
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QString text;
    switch(type)
    {
    case QtInfoMsg:
        text =  QString("[Info\t]");
        break;
    case QtDebugMsg:
        text = QString("[Debug\t]");
        break;
    case QtWarningMsg:
        text = QString("[Warning\t]");
        break;
    case QtCriticalMsg:
        text = QString("[Critical\t]");
        break;
    case QtFatalMsg:
        text = QString("[Fatal\t]");
    }
    QDateTime current_date_time = QDateTime::currentDateTime();
    QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
    QString message = text.append(current_date).append(" ").append(msg)
            .append(" file:").append(context.file)
            .append(" function:").append(context.function)
            .append(" category:").append(context.category)
            .append(" line:").append(QString::number(context.line)
            .append(" version:").append(QString::number(context.version)));
    QFile file(QString(QDate::currentDate().toString("yyyy-MM-dd") + ".txt"));
    file.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream text_stream(&file);
    text_stream<<message<<"\r\n";
    file.close();
}

输出的文件

可以看到输出按照日期格式的文件。


控制台和文件均输出

只需要在原本写入文件的位置,增加一行控制台输出即可。就能实现控制台、文件多出输出。

// 自定义消息处理程序
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QString text;
    switch(type)
    {
    case QtInfoMsg:
        text =  QString("[Info\t]");
        break;
    case QtDebugMsg:
        text = QString("[Debug\t]");
        break;
    case QtWarningMsg:
        text = QString("[Warning\t]");
        break;
    case QtCriticalMsg:
        text = QString("[Critical\t]");
        break;
    case QtFatalMsg:
        text = QString("[Fatal\t]");
    }
    QDateTime current_date_time = QDateTime::currentDateTime();
    QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
    QString message = text.append(current_date).append(" ").append(msg)
            .append(" file:").append(context.file)
            .append(" function:").append(context.function)
            .append(" category:").append(context.category)
            .append(" line:").append(QString::number(context.line)
            .append(" version:").append(QString::number(context.version)));
    QFile file(QString(QDate::currentDate().toString("yyyy-MM-dd") + ".txt"));
    file.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream text_stream(&file);
    qDebug() << message; // 实现控制台、文件多出输出
    text_stream<<message<<"\r\n";
    file.close();
}


卸载消息处理

需要恢复消息处理程序,调用qInstallMessageHandler(nullptr)即可。

qInstallMessageHandler(nullptr);
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
监控 Ubuntu 安全
如何在 VPS 上安装和使用 Logwatch 日志分析器和报告工具
如何在 VPS 上安装和使用 Logwatch 日志分析器和报告工具
51 1
|
2月前
|
缓存 Linux 编译器
【C++】CentOS环境搭建-安装log4cplus日志组件包及报错解决方案
通过上述步骤,您应该能够在CentOS环境中成功安装并使用log4cplus日志组件。面对任何安装或使用过程中出现的问题,仔细检查错误信息,对照提供的解决方案进行调整,通常都能找到合适的解决之道。log4cplus的强大功能将为您的项目提供灵活、高效的日志管理方案,助力软件开发与维护。
68 0
|
4月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
142 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
4月前
|
NoSQL Ubuntu Java
如何在 Ubuntu 14.04 上安装 Graylog2 并实现日志集中管理
如何在 Ubuntu 14.04 上安装 Graylog2 并实现日志集中管理
40 1
|
4月前
|
运维 监控 Ubuntu
一键启动日志魔法:揭秘ELK自动安装脚本的神秘面纱!
【8月更文挑战第9天】在数据驱动时代,高效处理日志至关重要。ELK Stack(Elasticsearch、Logstash、Kibana)是强大的日志分析工具,但其复杂的安装配置常让初学者望而却步。本文介绍如何编写ELK自动安装脚本,简化部署流程。脚本适用于Ubuntu系统,自动完成ELK下载、安装及基本配置,包括依赖项安装、服务启动及自启设置,极大降低了使用门槛,助力运维人员和开发者轻松构建日志分析平台。
169 6
|
6月前
Liunx怎么安装spdlog(这是用来管理日志部分)
Liunx怎么安装spdlog(这是用来管理日志部分)
127 7
|
6月前
Qt安装之后添加或移除组件(Qt Creator 10.0.1)
Qt安装之后添加或移除组件(Qt Creator 10.0.1)
301 2
|
6月前
|
IDE 开发工具 数据安全/隐私保护
【干货】Qt Creator快速下载、安装、使用教程
【干货】Qt Creator快速下载、安装、使用教程
|
6月前
|
SQL Linux 数据库
Linux上sqlite的安装和使用方法以及在QT中如何使用sqlite&笔记总结
Linux上sqlite的安装和使用方法以及在QT中如何使用sqlite&笔记总结
|
6月前
|
并行计算 Ubuntu 计算机视觉
【边缘智能】Jetson板卡上安装QT5与OpenCV集成
【边缘智能】Jetson板卡上安装QT5与OpenCV集成
153 0