当前位置: 首页 > 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.lryc.cn/news/601390.html

相关文章:

  • 多智能体系统设计:协作、竞争与涌现行为
  • Day4.AndroidAudio初始化
  • bash的特性-常用的通配符
  • bash的特性-命令和文件自动补全
  • C++ 多线程(一)
  • 第六章 JavaScript 互操(2).NET调用JS
  • ios UIAppearance 协议
  • 「iOS」————消息传递和消息转发
  • 携带参数的表单文件上传 axios, SpringBoot
  • 深度解读Go 变量指针
  • [每周一更]-(第152期):Go中的CAS(Compare-And-Swap)锁原理详解
  • iOS安全和逆向系列教程 第20篇:Objective-C运行时机制深度解析与Hook技术
  • 结合Golang语言说明对多线程编程以及 select/epoll等网络模型的使用
  • goland编写go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案
  • 学习Python中Selenium模块的基本用法(1:简介)
  • Day06–哈希表–242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
  • 仓库管理系统-2-后端之基于继承基类的方式实现增删改查
  • 7.25 C/C++蓝桥杯 |排序算法【下】
  • macOS 安装 Homebrew
  • JavaScript事件(event)对象方法与属性
  • mac配置多版本jdk
  • C#中Visual Studio平台按照OfficeOpenXml步骤
  • Min-Max标准化​ 和 ​Z-score标准化
  • Python队列算法:从基础到高并发系统的核心引擎
  • LeetCode|Day27|70. 爬楼梯|Python刷题笔记
  • Spring Retry 异常重试机制:从入门到生产实践
  • Spring Boot自动配置原理深度解析
  • 适配IE11(通过Babel+core-js转译ES6语法)
  • Flutter 生命周期介绍
  • 几个注册中心的特性