当前位置: 首页 > news >正文

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

而其中

#define QT_MESSAGELOG_FILE __FILE__
#define QT_MESSAGELOG_LINE __LINE__
#define QT_MESSAGELOG_FUNC Q_FUNC_INFO

    所以,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);

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

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

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

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

DEFINES += QT_NO_DEBUG_OUTPUT
http://www.lryc.cn/news/234142.html

相关文章:

  • 基于热交换算法优化概率神经网络PNN的分类预测 - 附代码
  • main.js 中的 render函数
  • Pandas 将DataFrame中单元格内的列表拆分成单独的行
  • PDF转化为图片
  • 【Java】智慧工地管理系统源码(SaaS模式)
  • torch.nn.functional.log_softmax 函数解析
  • jQuery、vue、小程序、uni-app中的本地存储数据和接受数据是什么?
  • 黑马React18: 基础Part 1
  • windows Oracle Database 19c 卸载教程
  • 动态规划解决leetcode上的两道回文问题(针对思路)
  • 使用人工智能自动测试 Flutter 应用程序
  • 四、程序员指南:数据平面开发套件
  • Go 之 captcha 生成图像验证码
  • 【Java从入门到大牛】多线程
  • UE5 C++报错:is not currently enabled for Live Coding
  • mysql服务器数据同步
  • Docker Golang 开发环境搭建指南
  • MFC保存窗口客户区为图片
  • JAVA安全之Shrio550-721漏洞原理及复现
  • 有Mac或无Mac电脑通用的获取安卓公钥的方案
  • 电池故障估计:Realistic fault detection of li-ion battery via dynamical deep learning
  • 微服务和Spring Cloud Alibaba介绍
  • 【js】 lodash命名转换和封装
  • RK3568驱动指南|第七篇 设备树-第67章 of操作函数实验:获取属性
  • vue3安装vue-router
  • 〖大前端 - 基础入门三大核心之JS篇㊱〗- JavaScript 的DOM节点操作
  • 【计算机基础】优雅的PPT就应该这样设计
  • Vatee万腾的科技征程:Vatee数字化创新的前沿探讨
  • 【PB续命05】WinHttp.WinHttpRequest的介绍与使用
  • 【Linux】进程间是这样通信的--管道篇