Qt全局函数qInstallMsgHandler安装消息句柄,实现日志输出
2013-11-19 16:08
651 查看
在Qt源码qglobal.h文件中有如下全局函数:
void qWarning(const char * msg,
... ) //警告信息
void qCritical(const char * msg,
... ) //危险信息
void qDebug(const char * msg,
... ) //调试信息
void qFatal(const char * msg,
... ) //致命信息
QtMsgHandler qInstallMsgHandler(QtMsgHandler handler) //安装消息回调句柄
Qt源码qglobal.cpp实现:
//告警日志
void qWarning(const char *msg, ...)
{
va_list ap;
va_start(ap, msg); // use variable arg list
qt_message(QtWarningMsg, msg, ap);
va_end(ap);
}
//日志内容转成QByteArray类型
static void qt_message(QtMsgType msgType, const char *msg, va_list ap)
{
#if !defined(QT_NO_EXCEPTIONS)
if (std::uncaught_exception()) {
qEmergencyOut(msgType, msg, ap);
return;
}
#endif
QByteArray buf;
if (msg) {
QT_TRY {
buf = QString().vsprintf(msg, ap).toLocal8Bit();
} QT_CATCH(const std::bad_alloc &) {
#if !defined(QT_NO_EXCEPTIONS)
qEmergencyOut(msgType, msg, ap);
// don't rethrow - we use qWarning and friends in destructors.
return;
#endif
}
}
qt_message_output(msgType, buf.constData());
}
//调用回调函数处理日志信息
void qt_message_output(QtMsgType msgType, const char *buf)
{
if (handler) {
(*handler)(msgType, buf); //调用设置的回调函数处理
} else {
...//其它的输出处理
}
}
如果我们在程序中设置了消息的回调句柄,调用qWarning、 qWarning 、 qDebug 、 qFatal 函数就会回调到自定义的消息函数处理日志。
案例:
1、自定义了一个LogOutPut日志回调函数
2、在主程序里调用qInstallMsgHandler安装消息回调函数句柄
3、在程序里调用了qWarning、 qWarning 、 qDebug 、 qFatal 全局函数
会检测回调句柄,不为空则调用消息回调函数
void qWarning(const char * msg,
... ) //警告信息
void qCritical(const char * msg,
... ) //危险信息
void qDebug(const char * msg,
... ) //调试信息
void qFatal(const char * msg,
... ) //致命信息
QtMsgHandler qInstallMsgHandler(QtMsgHandler handler) //安装消息回调句柄
Qt源码qglobal.cpp实现:
//告警日志
void qWarning(const char *msg, ...)
{
va_list ap;
va_start(ap, msg); // use variable arg list
qt_message(QtWarningMsg, msg, ap);
va_end(ap);
}
//日志内容转成QByteArray类型
static void qt_message(QtMsgType msgType, const char *msg, va_list ap)
{
#if !defined(QT_NO_EXCEPTIONS)
if (std::uncaught_exception()) {
qEmergencyOut(msgType, msg, ap);
return;
}
#endif
QByteArray buf;
if (msg) {
QT_TRY {
buf = QString().vsprintf(msg, ap).toLocal8Bit();
} QT_CATCH(const std::bad_alloc &) {
#if !defined(QT_NO_EXCEPTIONS)
qEmergencyOut(msgType, msg, ap);
// don't rethrow - we use qWarning and friends in destructors.
return;
#endif
}
}
qt_message_output(msgType, buf.constData());
}
//调用回调函数处理日志信息
void qt_message_output(QtMsgType msgType, const char *buf)
{
if (handler) {
(*handler)(msgType, buf); //调用设置的回调函数处理
} else {
...//其它的输出处理
}
}
如果我们在程序中设置了消息的回调句柄,调用qWarning、 qWarning 、 qDebug 、 qFatal 函数就会回调到自定义的消息函数处理日志。
案例:
1、自定义了一个LogOutPut日志回调函数
2、在主程序里调用qInstallMsgHandler安装消息回调函数句柄
3、在程序里调用了qWarning、 qWarning 、 qDebug 、 qFatal 全局函数
会检测回调句柄,不为空则调用消息回调函数
#include <QtDebug> #include <QFile> #include <QTextStream> #define _TIME_
qPrintable(QTime::currentTime ().toString ("hh:mm:ss:zzz")) void LogOutPut(QtMsgType type, const char* msg) { QString qstrText; switch (type) { case QtDebugMsg: qstrText = QString("%1: %2").arg(_TIME_, msg); break; case QtWarningMsg: qstrText = QString("%1: %2").arg(_TIME_, msg); break; case QtCriticalMsg: qstrText = QString("%1: %2").arg(_TIME_, msg); break; case QtFatalMsg: qstrText = QString("%1: %2").arg(_TIME_, msg); exit(0); } QFile out("log.txt"); out.open(QIODevice::WriteOnly | QIODevice::Append); QTextStream ts(&out); ts<<qstrText<<endl; } int main(int argc, char *argv[]) { QApplication a(argc, argv); qInstallMsgHandler(LogOutPut); 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(); }
相关文章推荐
- 实现Qt日志功能并输出到文件(使用qInstallMsgHandler安装customMessageHandler)good
- log4j.aditivity实现某类日志只输出到特定file
- Python使用logging结合decorator模式实现优化日志输出的方法
- 应用框架的设计与实现——.NET平台(9 消息队列产品安装)
- 树莓派(Debian)系统开启iptables的raw表实现日志输出
- spring 基于aop 实现日志输出 定义在controller层无效
- Log4J日志配置详解和自定义log4j日志级别及输出日志到不同文件实现方法
- Swift - 实现日志输出的封装1(显示出调用的文件名、方法、行号)
- 实现Qt日志功能并输出到文件
- SpringMVC 利用spring AOP实现每个请求的日志输出
- Log4j官方文档翻译(四、如何在java中输出日志消息)
- 两步实现Log4j记录java控制台输出的系统所有异常信息和自定义记录日志---->非常实用,强烈推荐阅读
- 命令行脚本实现守护程序并日志输出
- 面试宝典_Python.运维开发.0004.用Python实现tail实时输出新增日志?
- 使用logback.xml配置来实现日志文件输出
- 程序日志输出实现-Log4j
- 实现Qt日志功能并输出到文件
- Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms
- 简单的C++加载jvm实现--简单的日志输出--JAVA端程序
- 编写NSIS插件输出安装过程的日志