您的位置:首页 > 编程语言 > Qt开发

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 全局函数
会检测回调句柄,不为空则调用消息回调函数

#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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: