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();
}