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 *[]))
更多参考
Qt之qInstallMessageHandler(输出详细日志)的更多相关文章
- Qt之qInstallMessageHandler(重定向至文件)
简述 在Qt之qInstallMessageHandler(输出详细日志)一节中,我们讲解了如何使用自定义消息处理程序输出调试信息,而且可以很直观.很方便的得到输出代码所在的文件.函数.行号等信息. ...
- Qt5 调试之详细日志文件输出(qInstallMessageHandler)
注明:以下方法仅适用于 Qt5 及以上版本 函数说明: QtMessageHandler qInstallMessageHandler(QtMessageHandler handler) 此函数在使 ...
- Qt on Android:将Qt调试信息输出到logcat中
版权全部 foruok .如需转载敬请注明出处(http://blog.csdn.net/foruok). 假设你在目标 Android 设备上执行了 Qt on Android 应用,你可能希望看到 ...
- Tomcat遇到”Error listenerStart”或”Error filterStart”问题且无详细日志时的log配置.
昨天部署web应用到Tomcat之后,无法成功启动,并且控制台没有详细的错误信息,顶多就两行提示信息,例如:严重: Error listenerStart严重: Context [/lizongbo] ...
- [Java] log4j异常输出到日志
当程序运行异常时,e.printStackTrace()会打印出异常.但是很多时候我们希望将这些异常输出到日志中,以便日后可以随时查看到,可以通过这些异常快速的找到程序发生异常的代码. 那么有办法可以 ...
- JAVA异常处理原则和log4j输出详细异常分析
1.多用try,catch;不要一个try,catch包含所有内容 好处:不同模块抓取不同异常,某一模块异常挂了,不影响其他模块的程序的进行 2.多写几个catche:尽量不要使用Exception这 ...
- Log4j 输出的日志中时间比系统时间少了8小时的解决方法,log4j日志文件重复输出
1. 第一个问题:时间少了8小时 Log4j 输出的日志中,时间比系统时间少了8小时,但是 eclipse 控制台输出的日志的时间却是对的. log4j配置如下: #all logger output ...
- Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志
在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法), 发现出现异常时,log4j无法在控制台输出错误日志.因此需要自定义 ...
- StackTrace堆栈跟踪记录详细日志
使用StackTrace堆栈跟踪记录详细日志(可获取行号) 2014-04-25 22:30 by 螺丝钉想要螺丝帽, 350 阅读, 3 评论, 收藏, 编辑 上一篇我们提到使用.NET自带的Tra ...
随机推荐
- [Office]PPT 2013如何设置图片为半透明?
PPT里面似乎无法直接为图片设置透明度属性.下面是一种变通的办法. 1,插入一个和图片大小一致的图形(矩形):2,右键插入的矩形,然后在属性设置里选择“图片填充”,选择以需要的图片填充到该矩形里:3, ...
- HDU 4268 Alice and Bob(贪心+Multiset的应用)
题意: Alice和Bob有n个长方形,有长度和宽度,一个矩形能够覆盖还有一个矩形的条件的是,本身长度大于等于还有一个矩形,且宽度大于等于还有一个矩形.矩形不可旋转.问你Alice最多能覆盖Bo ...
- poj - 1159 - Palindrome(滚动数组dp)
题意:一个长为N的字符串( 3 <= N <= 5000).问最少插入多少个字符使其变成回文串. 题目链接:http://poj.org/problem?id=1159 -->> ...
- Oracle新建Schema
1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 password: 新用户的密码也可以不创建新 ...
- BZOJ3170: [Tjoi2013]松鼠聚会
[传送门:BZOJ3170] 简要题意: 给出n个点的坐标,规定两个点的距离=max(|x1-x2|,|y1-y2|) 要求选出一个点,使得这个点到所有点的距离和最小 题解: 切比雪夫转换例题 将一个 ...
- Spark SQL 编程API入门系列之SparkSQL数据源
不多说,直接上干货! SparkSQL数据源:从各种数据源创建DataFrame 因为 spark sql,dataframe,datasets 都是共用 spark sql 这个库的,三者共享同样的 ...
- Centos7 minimal 系列之Redis(五)
一.Redis安装 1.1 .进入/usr/local 创建redis文件夹(mkdir)方便统一管理 1.2.下载redis $ wget http://download.redis.io/rele ...
- JavaScript中闭包的理解
1.什么是闭包 我个人理解闭包就是函数中嵌套函数,但是嵌套的那个函数必须是返回值,才构成闭包: <!DOCTYPE html> <html> <head> < ...
- 微信小程序 input使用letter-spacing失效问题
根据ui设计稿, 本来思路是一个input搞定,下面的线使用背景图 background:url('/images/line.png')no-repeat bottom center; 然后使用let ...
- SQL学习——基础语句(1)
简序 1.SQL,指结构化查询语言,全称是 Structured Query Language. 2.SQL 让您可以访问和处理数据库. 3.SQL 是一种 ANSI(American Nationa ...