Qt之qInstallMessageHandler(输出详细日志)

简述

安装之前已定义的消息处理程序,返回一个指向前一个消息处理程序。

消息处理程序是一个函数,用于打印调试信息、警告信息、严重错误和致命的错误的消息。Qt库(debug模式)包含成百上千的警告信息打印,当发生内部错误时(通常是无效的函数参数)。Qt在release模式下构建还包含这些警告,除非在编译时设置QT_NO_WARNING_OUTPUT和/或QT_NO_DEBUG_OUTPUT。如果你实现自己的消息处理程序,就可以完全控制这些消息。

缺省的消息处理程序向标准输出打印消息。如果是一个致命的消息,应用程序就会立即中止。

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

调用qInstallMessageHandler(0)可以恢复消息处理程序。

  • 简述
  • 调试级别
  • 正常使用
  • 自定义消息处理
  • 更多参考

调试级别

Q包含用于警告和调试文本的全局宏:

  • qDebug()
    调试消息
  • qInfo()
    信息消息
  • qWarning()
    警告消息和可恢复的错误
  • qCritical()
    关键错误和系统错误
  • qFatal()
    致命错误

如果包含头文件<QDebug>,就可以将所述qDebug()宏用作一个输出流。

例如:

qDebug() << "Widget" << widget << "at position" << widget->pos();

Windows中,如果是一个控制台应用程序,文本将被发送到控制台;否则,被发送到调试器。

正常使用

一般情况下,在调试程序的时候,我们会输出一些调试信息,便于程序跟踪。

例如:

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    // 打印信息
    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 app.exec();
}

输出如下:

This is a debug message.
This is a warning message.
This is a critical message.
This is a fatal message.

自定义消息处理

一般情况下,一个大型项目会出现很多这样类似的调试信息,很不利于查找,因为我们根本不清楚输出信息所在的文件、函数、行号等信息。

下面,我们来根据需要自定义消息处理程序。

#include <QApplication>
#include <stdio.h>
#include <stdlib.h>

// 自定义消息处理程序
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    switch (type) {
    case QtDebugMsg:
        fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtInfoMsg:
        fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtWarningMsg:
        fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtFatalMsg:
        fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        abort();
    }
}

int main(int argc, char **argv)
{
    QApplication app(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 app.exec();
}

这时,我们不仅可以输出调试信息,而且可以很直观、很方便的得到输出代码所在的文件、函数、行号等信息。

输出如下:

Debug: This is a debug message. (..\MessageOutput\main.cpp:90, int __cdecl main(int,char *[]))
Warning: This is a warning message. (..\MessageOutput\main.cpp:91, int __cdecl main(int,char *[]))
Critical: This is a critical message. (..\MessageOutput\main.cpp:92, int __cdecl main(int,char *[]))
Fatal: This is a fatal message. (..\MessageOutput\main.cpp:93, int __cdecl main(int,char *[]))

更多参考

时间: 2024-08-14 07:17:01

Qt之qInstallMessageHandler(输出详细日志)的相关文章

Qt之qInstallMessageHandler(重定向至文件)

简述 在Qt之qInstallMessageHandler(输出详细日志)一节中,我们讲解了如何使用自定义消息处理程序输出调试信息,而且可以很直观.很方便的得到输出代码所在的文件.函数.行号等信息. 当软件发布的时候,通常都会采用日志输出功能,方便我们后期的跟踪.查找问题. 简述 自定义消息处理 效果 源码 更多参考 自定义消息处理 下面,我们来根据需要自定义消息处理程序.其中输出格式包含:输出信息.文件.函数.行号.日期时间.这样就很利于我们追踪了. 效果 源码 void myMessageO

在Wordpress iNove主题中利用Simple Tags插件实现输出相关日志的方法

考虑各方面的情况,我没有采用其他一些wordpress相关日志(RelatedPosts)插件,而是充分应用Simple Tags插件强大的相关日志,相关标签功能,结合iNove主题,利用Simple Tags实现了输出相关日志的功能,感觉还不错.虽然Simple Tags可以通过后台设定相关日志,但是添加的相关日志列表不能控制其出现的位置. 安装步骤如下: 第一步:下载并安装Simple Tags插件.为什么要先安装这个插件呢?因为Simple Tags插件可以根据标签产生相关日志. 第二步:

mysql-新闻app获取新闻,获取不了,输出的日志在下边麻烦大神看看

问题描述 新闻app获取新闻,获取不了,输出的日志在下边麻烦大神看看 java写的服务端接口,tomcat,mysql都能正常运行,数据库里有信息. 03-17 10:55:13.347: E/ActivityThread(26507): mtprof entry can not be found 03-17 10:55:13.347: E/ActivityThread(26507): java.io.FileNotFoundException: /proc/mtprof/status: ope

tomcat log4j error-tomcat 启动报错,没有详细日志

问题描述 tomcat 启动报错,没有详细日志 tomcat 启动报错,没有详细日志 16-04-12 16:21:54 INFO Http11Protocol:188 - Initializing Coyote HTTP/1.1 on port 8080 16-04-12 16:21:54 INFO Catalina:536 - Initialization processed in 265 ms 16-04-12 16:21:54 INFO StandardService:511 - Sta

tomcat启动后,总是输出这些日志,想了解一下是什么意思?

问题描述 我的tomcat启动后,总是输出以下日志:2012-04-18 10:02:18,109 DEBUG [org.apache.catalina.session.ManagerBase] [org.apache.catalina.session.ManagerBase.processExpires(ManagerBase.java:677)] - <Start expire sessions StandardManager at 1334714538109 sessioncount 0>

Websphere日志输出格式问题,为何所有通过log4j输出的日志开头都被附加上SystemOut的标识?

问题描述 我刚刚开始使用WebSphere,发现日志中有个小小的问题,在Log4j中设置的输出格式是类似下面这样输出的:[JndiTools.bean(JndiTools.java:79)]INFO-Thisissomeinfo. 但是如果输出到WebSphere上的话,查看SystemOut.log时发现,在所有输出的日志前都加上了这样一句:[3/25/1121:13:52:234CST]00000030SystemOutO 即是最终输出是这样的:[3/25/1121:13:52:234CST

iOS Xcode8更新后输出log日志关闭的方法_IOS

刚把Xcode更新到最新的8,一运行发现好多log输出,根据如下操作可以关掉这些log日志,点击项目Edit Scheme - Run - Arguments - Environment Variables里添加:Name:OS_ACTIVITY_MODE  Value:disable 如图:

PowerShell默认参数$PSDefaultParameterValues结合Out-File输出到日志文件_PowerShell

输出log是一个永恒的话题,什么tracelistener,net4log,nlog,windows中自带的eventlog,之前在自动重定向PowerShell控制台输出到文件 也算.其实借助于PowerShell 3.0以后的PowerShell默认参数$PSDefaultParameterValues,可以让Out-File,命令也变成也简易的Log神器. 复制代码 代码如下: $PSDefaultParameterValues['Out-File:FilePath'] = 'mylog.

如何获取复制代理的详细日志

1.In SQL Enterprise Manager, click the Replication Monitor Node to open the Replication Monitor on the server configured as the Distributor.2.Click Open on the Publishers node.3.Click the publisher that has the publication that has the problem.4.Clic