QT 调试信息如何输出日志到文件(qDebug/qWarning/qCritical/qFatal)

一、基本分类
qDebug : 调试信息提示
qWarning: 一般的警告提示
qCritical: 严重错误提示
qFatal: 致命错误提示

二、截获信息
Qt提供了qInstallMsgHandler 方法用来定制消息发生后如何来处理。
qInstallMsgHandler 是一个回调函数,主要是由qDebug、qWarning、qCritical、qFatal这些函数进行触发。也就是说,qDeubg这些函数处理的消息文本会被qInstallMsgHandler 所指向的回调函数截获,这样就允许用户自己来处理这些消息文本。

三、示例代码
将qDebug、qWarning、qCritical、qFatal这些函数输出的信息,保存到日志文件。

#include 
#include 
#include 
#include 
#include 
#include 
static QMutex mutex;


void customMessageHandler(QtMsgType type, 
                          const QMessageLogContext &context,
                          const QString &msg)
{
    //Q_UNUSED(context)
    QDateTime _datetime = QDateTime::currentDateTime();
    QString szDate = _datetime.toString("yyyy-MM-dd hh:mm:ss.zzz");//"yyyy-MM-dd hh:mm:ss ddd"
    QString txt(szDate);

    switch (type)
    {
        case QtDebugMsg://调试信息提示
        {
            txt += QString(" [Debug] ");
            break;
        }
        case QtInfoMsg://信息输出
        {
            txt += QString(" [Info] ");
            break;
        }
        case QtWarningMsg://一般的warning提示
        {
            txt += QString(" [Warning] ");
            break;
        }
        case QtCriticalMsg://严重错误提示
        {
            txt += QString(" [Critical] ");
            break;
        }
        case QtFatalMsg://致命错误提示
        {
            txt += QString(" [Fatal] ");
            //abort();
            break;
        }
        default:
        {
            txt += QString(" [Trace] ");
            break;
        }
    }

    txt.append( QString(" %1").arg(context.file) );
    txt.append( QString("<%1>: ").arg(context.line) );
    txt.append(msg);

    mutex.lock();
    QFile file("log.txt");
    file.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream text_stream(&file);
    text_stream << txt << "\r\n";
    file.close();
    mutex.unlock();
}

#define GBK(x)      QString::fromLocal8Bit(x)
#define GBK_LOG(x)  QString::fromLocal8Bit(x).toUtf8().data()

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //注册MessageHandler
    qInstallMessageHandler(customMessageHandler);

    qDebug() << "this is QtDebugMsg";
    qInfo() << "this is QtInfoMsg";
    qWarning() << "this is QtWarningMsg";
    qCritical() << "this is QtCriticalMsg";

    //GBK修饰的输出带双引号,GBK_LOG修饰的不会带双引号
    qDebug() << GBK("测试qDebug");
    qInfo() << GBK("测试qInfo");
    qWarning() << GBK_LOG("测试qWarning");
    qCritical() << GBK_LOG("测试qCritical");
    //qFatal() << "QtFatalMsg";
    //qFatal("This is a fatal message");

    return a.exec();
}

四、取消信息处理
只要执行qInstallMessageHandler(0) 就行,但是这会把所有的信息输出都屏蔽掉!

如果只是想屏蔽debug或者warning信息的输出,这时候就需要预定义宏:
在工程文件.pro里面添加

DEFINES += QT_NO_WARNING_OUTPUT\
QT_NO_DEBUG_OUTPUT

然后重新构建,这样就能去掉qDebug的打印信息了。
也可以设置

Release:DEFINES += QT_NO_WARNING_OUTPUT\
QT_NO_DEBUG_OUTPUT

这样只是在Release版本的时候不打印对应调试和警告消息。

你可能感兴趣的:(Qt,/,Qt,Creator)