• Qt的日志输出


    在Qt中,一般习惯使用qDebug信息进行输出和打印调试信息到console或者文件中,在qDebug中,也有一些小技巧,可以帮助我们更好的使用qDebug打印日志记录,本文分享了qDebug使用的一些小技巧。


    1. 打印出文件名、行号、调用函数等上下文信息

        有些时候是不是可能会遇见这样的事情,自己不知道在哪儿打印了一串debug信息,但是现在不知道在哪儿了,并且由于文件很多,比较难以寻找。本次提到的方法就可以解决这个问题。首先,要明白一件事,打印出行号、文件名一定要在调用qDebug时就知道当前位置,C语言是通过 __FILE__ __LINE__ 这些东西得到的,而qDebug也是一样的方式,它是一个宏实现是这个样子的。

    #define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug
    #define qInfo QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).info
    #define qWarning QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).warning
    #define qCritical QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).critical
    #define qFatal QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).fatal
    
    • 1
    • 2
    • 3
    • 4
    • 5

    而其中

    #define QT_MESSAGELOG_FILE __FILE__
    #define QT_MESSAGELOG_LINE __LINE__
    #define QT_MESSAGELOG_FUNC Q_FUNC_INFO
    
    • 1
    • 2
    • 3

        所以,qDebug 本身应该是支持了打印上下文信息的,但是为什么我们平时打印的信息没有呢?

        这个是因为需要去设置一下message的pattern

        设置pattern有两种方法:

    1. qSetMessagePattern 函数
      通过函数设置格式,例如: qSetMessagePattern("[%{type}]%{file}:%{line}\t%{time}\t%{function}\n%{message}")

    2. QT_MESSAGE_PATTERN 环境变量
      通过设置全局环境变量或者使用qputenv("QT_MESSAGE_PATTERN", "[%{type}]%{file}:%{line}\t%{time}\t%{function}\n%{message}");的手法,来设置pattern

        或者换个思路,qt为我们提供了一个handle,使用 qInstallMessageHandler设置

    void msgHandle(QtMsgType type, const QMessageLogContext &context, const QString &msg)
    {
        printf("Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
    }
    
    qInstallMessageHandler(msgHandle);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2. 将qDebug内容输出到文件中

        将qDebug输出到文件当中则是直接采用 qInstallMessageHandler的思路来做,在这个函数中,将printf改成fprintf即可。

    3. 正式运行时屏蔽掉 debug 信息

        在qlogging.h中有一段代码

    #if defined(QT_NO_DEBUG_OUTPUT)
    #  undef qDebug
    #  define qDebug QT_NO_QDEBUG_MACRO
    #endif
    
    • 1
    • 2
    • 3
    • 4

        意味着其实当定义了上面的qDebug宏后,其实下面还有宏条件重新定义,展开看看 QT_NO_QDEBUG_MACRO则是

    #define QT_NO_QDEBUG_MACRO while (false) QMessageLogger().noDebug
    
    • 1

        所以,我们在编译时,加入一个宏即可(pro文件直接写法如下:)

    DEFINES += QT_NO_DEBUG_OUTPUT
    
    • 1
  • 相关阅读:
    列出使用Typescript的一些优点?
    web3开发课程精选
    Win10电脑需要安装杀毒软件吗?
    Nature发布:ChatGPT 帮助我进行学术写作的三种方式
    猿创征文|Redis事务问题
    升级版弹跳的小球
    [附源码]计算机毕业设计JAVAjsp高校学生资助信息系统
    零零信安-D&D数据泄露报警日报【第34期】
    docker问题解决记录
    云与云计算:从传统到云端的IT资源变革
  • 原文地址:https://blog.csdn.net/qq_51986723/article/details/134466662