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

2.qt调试日志输出

目录

  • 1.输出方式
  • 2.使用案例
  • 3.日志开关
    • 编译控制
    • 变量控制
  • .使用建议
  • 日志重定向

1.输出方式

#include "widget.h"
#include <QDebug>#include <QApplication>int main(int argc, char *argv[])
{qDebug()<< "qDebug";	//调试信息qWarning()<< "qWarning";	//警告信息qInfo()<<"qInfo";	//普通信息qCritical()<< "qCritical";	//错误信息//qFatal()<<"qFatal";	//致命错误,终止程序QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

本质上就是一个定义来着,调用栈对象的一个接口

#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

而qdbug()重写了6个
在这里插入图片描述
而我们常用的应该是触发了

void debug(const char *msg, …) const

2.使用案例

#include "widget.h"
#include <QDebug>
#include <QLoggingCategory>#include <QApplication>
// Q_DECLARE_LOGGING_CATEGORY(myAppCore)
Q_LOGGING_CATEGORY(myAppCore, "myapp.core")QString print()
{qWarning()<< "qWarning";qInfo()<<"qInfo";qCritical()<< "qCritical";return "222";
}int main(int argc, char *argv[])
{qCDebug(myAppCore)<< print();qDebug()<< print();QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

3.日志开关

编译控制

通过工程文件中设置日志禁用宏
编译器会优化掉日志代码,​零运行时开销。
意思就是使用案例中print()函数是不会执行的

DEFINES += QT_NO_DEBUG_OUTPUT
DEFINES += QT_NO_INFO_OUTPUT
DEFINES += QT_NO_WARNING_OUTPUT

变量控制

无需重新编译​:修改后直接重启应用即可生效。
​灵活控制​:可针对不同模块、不同日志级别(Debug/Info/Warning等)单独开关。
​性能影响​:日志代码仍会执行(如参数计算),但不会输出到控制台/文件。使用案例中的print()依旧会被执行

# 关闭 "myapp.core" 分类的所有日志
export QT_LOGGING_RULES="myapp.core.*=false"# 仅关闭 "myapp.network" 的 debug 日志,保留其他级别
export QT_LOGGING_RULES="myapp.network.debug=false"# 同时控制多个分类
export QT_LOGGING_RULES="myapp.core.debug=false; myapp.network.warning=true"

.使用建议

​开发阶段​:使用运行时禁用,灵活调试不同模块的日志。
​发布版本​:结合编译期禁用(QT_NO_DEBUG_OUTPUT)彻底移除日志开销。

日志重定向

可结合 QtMessageHandler 自定义处理函数

QtMessageHandler qInstallMessageHandler(QtMessageHandler);

#include <QApplication>
#include <QFile>
#include <QTextStream>void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {// 自定义处理逻辑(示例:写入文件 + 控制台)QFile logFile("app_log.txt");if (logFile.open(QIODevice::WriteOnly | QIODevice::Append)) {QTextStream stream(&logFile);stream << "[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") << "] "<< msg << "\n";}// 可选:同时输出到标准错误(控制台)QTextStream(stderr) << msg << "\n";
}int main(int argc, char *argv[]) {qInstallMessageHandler(myMessageHandler); // 注册自定义处理器//qInstallMessageHandler(nullptr); // 恢复默认处理器QApplication app(argc, argv);qDebug() << "This is a debug message";   // 会被 myMessageHandler 处理qCritical() << "Something went wrong!"; // 同上return app.exec();
}
http://www.dtcms.com/a/300869.html

相关文章:

  • 区块链共识机制与联邦学习
  • 【C++】数字cmath库常用函数
  • 基于深度学习的图像分类:使用ShuffleNet实现高效分类
  • LeetCode 1577.数的平方等于两数乘积的方法数
  • day061-全网监控
  • 【科研绘图系列】R语言绘制边际云雨图散点图
  • 【unitrix】 6.17 基本非负整数( BaseUnsigned )特质(base_unsigned.rs)
  • 【笔记】拉乌尔定律推导
  • 获取电脑主板的 通用唯一标识符(UUID)
  • C++学习(线程相关)
  • Git+宝塔面板部署Hugo博客
  • 【橘子分布式】gRPC(番外篇-客户端重试机制)
  • 五自由度磁悬浮轴承转子不平衡振动破壁战:全息前馈控制实战密码
  • 【DataWhale】快乐学习大模型 | 202507,Task08笔记
  • STM32移植LVGL9.2.1教程
  • 视频转GIF工具,一键批量制作高清动图
  • CLAP文本-音频基础模型: LEARNING AUDIO CONCEPTS FROM NATURAL LANGUAGE SUPERVISION
  • 设计模式(四)创建型:生成器模式详解
  • 设计模式(三)创建型:抽象工厂模式详解
  • 第五章第二节 对射式红外传感器计次旋转编码器计次
  • 8.c语言指针
  • 标签驱动的可信金融大模型训练全流程-Agentar-Fin-R1工程思路浅尝
  • AI驱动的金融推理:Fin-R1模型如何重塑行业决策逻辑
  • JSON格式化与结构对比
  • 2025年量子计算与前沿技术融合:六大变革性方向深度解析
  • Rust实战:高效开发技巧
  • 02人工智能中优雅草商业实战项目视频字幕翻译以及声音转译之以三方AI模型API制作方式预算-卓伊凡|莉莉
  • 【在Unity游戏开发中Dictionary、List介绍】
  • 基于Springboot+UniApp+Ai实现模拟面试小工具七:前端项目创建及框架搭建
  • 深入理解 Spring 中的 XmlBeanFactory 原理及实践