重格式化输出QT的QDebug信息

7 篇文章 0 订阅
5 篇文章 0 订阅

QT-Creator的qDebug()输出调试信息很方便,并且可以简单的重定向保存为log文件。但是qDebug()输出的信息没有直接带上当前文件名和行号,甚至当前系统日期时间等信息。
这里介绍一个方法重新格式化qDebug()输出信息,可以添加上你需要显示的额外信息,同时保存成log文件。


QtMessageHandler gDefaultHandler = NULL;
 
// get default handler of message handler
gDefaultHandler = qInstallMessageHandler(myMessageOutput);
 
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QString strMsg("");
    switch(type)
    {
    case QtDebugMsg:
        strMsg = QString("Debug:");
        break;
    case QtInfoMsg:
        strMsg = QString("Info:");
        break;
    case QtWarningMsg:
        strMsg = QString("Warning:");
        break;
    case QtCriticalMsg:
        strMsg = QString("Critical:");
        break;
    case QtFatalMsg:
        strMsg = QString("Fatal:");
        break;
    default:
        strMsg = QString("Err:");
        break;
    }

    QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
    QString current_date = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    QString message = QString("%1 %2 %3 %4").arg(current_date).arg(strMsg).arg(context_info).arg(msg);

    // lock
    static QMutex mutex;
    mutex.lock();

    // output to the file log.txt
    QFile file("D:\\log.txt");
    file.open(QIODevice::ReadWrite | QIODevice::Append);
    QTextStream stream(&file);
    stream << message << "\r\n";
    file.flush();
    file.close();
 
    // unlock
    mutex.unlock();
 
    // display debug info in IDE
    if (gDefaultHandler)
    {
        gDefaultHandler(type, context, message);
    }
 
}

在QT-Creator的应用程序输出栏里显示的效果如下:

//qDebug("hello world!!");
2019-05-05 10:37:19 Debug: File:(test.cpp) Line:(583) hello world!!

为了避免release版本里文件名context.file、函数名context.function、行数context.line消失的问题,需要在pro文件里加入以下选项,然后重编译以保证该选项生效。

DEFINES += QT_MESSAGELOGCONTEXT

另一方法,无需重设置qInstallMessageHandler,可以在每次调用qDebug()时,输入文件名和行数,如下:

qDebug("File: %s Line: %d hello world!!!", __FILE__, __LINE__);
//File: test.cpp Line:583 hello world!!!

以上方法,根据实际需要,自行选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值