Qt日志输出及QsLog日志库

目录

  • Qt日志输出及QsLog日志库
    • 日志输出
      • 格式化日志
      • 普通格式化
      • 条件格式化
      • 环境变量设置格式化
      • 日志输出位置
      • 日志输出对象信息
      • 禁用输出
    • QsLog日志库
      • 使用方法
        • 1. 将QsLog目录添加到项目中
        • 2. 配置CMakeLists.txt文件
        • 3. 配置.pro文件
        • 4. 日志记录器的配置
        • 5. 运行程序
        • 6. 启用行号和文件名
          • CMakeLists.txt
          • .pro 文件
        • 7. 禁用日志输出
          • CMakeLists.txt
          • .pro 文件

Qt日志输出及QsLog日志库

日志输出

Qt提供了多种方式进行日志输出,常用的有qDebug(), qInfo(), qWarning(), qCritical()qFatal()

这些输出函数定义在#include <QDebug>中,并且可以像标准C++的输出流一样使用。

分类说明
qDebug()用于调试信息输出,通常用于开发阶段输出调试信息。
qInfo()用于一般的信息输出,适合输出一般运行状态信息。
qWarning()用于警告信息输出,通常用于提示可能的问题。
qCritical()用于严重错误信息输出,通常用于提示不可恢复的错误。
qFatal()用于致命错误信息输出,通常会中止程序的运行。

C风格输出

qDebug("我是%s,今年%d岁了~","qDebug",20);
qInfo("老铁%d",666);
qWarning("hello %s","warning");
qCritical("helo %s","critical");
qFatal("hello %s","qFatal");		// 注意:qFatal 会中断程序执行

C++风格

qDebug()<<"qDebug";
qInfo()<<"qInfo";
qWarning()<<"qWarnning";
qCritical()<<"qCritical";
#qFatal()<<"qFatal";			   // qFatal()不能用"<<"输出

格式化日志

默认情况下,日志格式是只输出对应的日志内容没有额外信息的。可以通过修改环境变量QT_MESSAGE_PATTERN或者调用方法 qSetMessagePattern来修改日志的输出格式。日志格式中常用的占位符号如下所示:

%{appname}     应用程序的名称(QCoreApplication::applicationName())
%{category}    日志所处的领域
%{file}        打印该日志的文件路径 
%{function}    打印日志的函数
%{line}        打印日志在文件中的行数
%{message}     日志的内容
%{pid}         打印日志的程序的PID(QCoreApplication::applicationPid())
%{threadid}    打印日志的线程ID
%{qthreadptr}  打印日志的线程指针
%{type}        日志级别("debug", "warning", "critical" or "fatal")
%{time process}日志发生时程序启动了多久
%{time boot}   日志发生时系统启动了多久
%{time [format]}以固定时间格式输出日志打印的时间,默认为QISODate格式

普通格式化

格式化日志方法如下:

#include <QApplication>
#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);qSetMessagePattern("%{time yyyy-MM-dd hh:mm:ss} [%{type}] %{file} [%{function}(%{line})]  %{message}");qInfo()<<"info";qDebug()<<"debug";qWarning()<<"warning";qCritical()<<"Critical";return a.exec();
}

输出的日志内容如下:

2024-09-19 10:35:25 [info] ..\..\main.cpp [qMain(9)]  info
2024-09-19 10:35:25 [debug] ..\..\main.cpp [qMain(10)]  debug
2024-09-19 10:35:25 [warning] ..\..\main.cpp [qMain(11)]  warning
2024-09-19 10:35:25 [critical] ..\..\main.cpp [qMain(12)]  Critical

注意:在Release模式下,文件名、函数名、行号获取不到,需要添加编译时宏QT_MESSAGELOGCONTEXT

条件格式化

在消息参数中还可以使用条件,给不同级别的日志指定不同的格式,语法如下:

%{if-<debug | info | warning | critical | fatal>} ... %{endif}

比如,只想在debug级别下输出文件名、函数名以及行号,代码格式如下:

qSetMessagePattern("%{time yyyy-MM-dd hh:mm:ss} [%{type}] %{if-debug}%{file}%{endif} %{if-} [%{function}(%{line})]  %{message}");

环境变量设置格式化

格式也可以在运行时通过设置QT_MESSAGE_PATTERN环境变量来更改;

如果调用了qSetMessagePattern()并且设置了QT_MESSAGE_PATTERN,则环境变量优先。

qputenv("QT_MESSAGE_PATTERN", QByteArray("%{time yyyy-MM-dd hh:mm:ss} [%{type}] %{file} [%{function}(%{line})]  %{message}"));

日志输出位置

Qt 默认的日志内容是输出到终端的,不会输出到文件里面,如果需要将日志内容输出到文件中,需要通过qInstallMessageHandler设置日志信息处理函数。使用方法如下:

#include <QApplication>
#include <QFile>
#include <QDebug>
#include <QTextStream>// 日志消息的处理函数
void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message)
{// 获取格式化的日志信息QString typeStr = qFormatLogMessage(type, context, message);// 可以根据日志的级别进行过滤(比如不想要 Debug 输出,可以直接 return)QString levelText;switch (type){case QtDebugMsg:levelText = "Debug";// return;	// 加上 return 之后就不会打印 debug 日志了break;case QtInfoMsg:levelText = "Info";break;case QtWarningMsg:levelText = "Warning";break;case QtCriticalMsg:levelText = "Critical";break;case QtFatalMsg:levelText = "Fatal";break;}QFile file("log.log");file.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream textStream(&file);textStream << typeStr << "\n";
}int main(int argc, char *argv[])
{QCoreApplication app(argc, argv);qSetMessagePattern("%{time yyyy-MM-dd hh:mm:ss} [%{type}]%{if-warning}[%{function}]%{endif}%{if-fatal}[%{function}--%{line}]%{endif}:%{message}");qInstallMessageHandler(logMessageHandler);qDebug() << "debug info occurred";qInfo() << "call other function";qWarning() << "doesn't work";qFatal("fatal error");return app.exec();
}

如果需要关闭日志输出,取消之前注册的日志处理函数,可以调用qInstallMessageHandler(nullptr);

日志输出对象信息

在调试一些复杂对象的时候,需要输出对象的成员信息到日志当中。但是默认情况下 Qt 的日志库是不支持输出自定义对象的。这时候可以通过重写操作符实现对自定义对象的日志输出。使用方法如下:

class Person
{
public:QString name;quint8   age;inline friend QDebug operator<<(QDebug debug,const Person& person){debug<<"Person("<<person.name<<","<<person.age<<")";return debug;}
};int main(int argc,char*argv[])
{QCoreApplication app(argc, argv);Person person{"shayebushi",18};  // 输出:Person( "shayebushi" , 18 )qDebug()<<person;return app.exec();
}

禁用输出

在开发或者调试时,我们必须借助日志来进行判断,但是当程序需要发布时,调试的日志信息将不再需要,此时如果把代码删除,又不太方便,万一出bug了,又需要调试了呢?

所以Qt提供了禁用qInfoqWarningqDebug输出的宏,qCriticalqFatal是错误不能屏蔽!

CMakeLists.txt 文件中禁用日志输出

在CMakeLists.txt文件中添加如下三行,即可禁用qInfoqWarningqDebug的输出。

add_compile_definitions(QT_NO_INFO_OUTPUT)
add_compile_definitions(QT_NO_DEBUG_OUTPUT)
add_compile_definitions(QT_NO_WARNING_OUTPUT)
#或
add_compile_definitions(QT_NO_INFO_OUTPUTQT_NO_DEBUG_OUTPUTQT_NO_WARNING_OUTPUT)

.pro 文件中禁用日志输出

在 .pro 文件中添加如下三行,即可禁用 qInfoqWarningqDebug 的输出。

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

QsLog日志库

QsLog是一个基于Qt的QDebug类的易于使用的记录器。QsLog是在MIT许可下以开源形式发布的。

QsLog Github下载

QsLog的特征:

  • 六个日志级别(从跟踪到致命);
  • 运行时可配置的日志级别阈值;
  • 关闭日志记录时的最小开销;
  • 支持多个目标,附带文件和调试目标;
  • 线程安全;
  • 支持现成的常见Qt类型的日志记录;
  • 小依赖:直接把它放到你的项目中。

使用方法

1. 将QsLog目录添加到项目中

将QsLog目录直接拷贝到项目的根目录中,与CMakeLists.txt.pro文件同级。

QsLog目录

2. 配置CMakeLists.txt文件

打开项目的CMakeLists.txt文件,输入如下代码:

# 添加子目录
add_subdirectory(./QsLog)# 添加可执行文件
add_executable(QsLog_test main.cpp)# 把QsLog库链接到目标 QsLog_test
target_link_libraries(QsLog_test Qt${QT_VERSION_MAJOR}::Core QsLog)
3. 配置.pro文件

如果你使用的是qmake构建系统,打开项目的.pro文件,输入如下代码:

# 指定包含QsLog目录
include(QsLog/QsLog.pri)
4. 日志记录器的配置

在你的代码中进行日志记录器的配置:

#include <QCoreApplication>
#include "QsLog/QsLog.h"
#include "QsLog/QsLogDest.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);using namespace QsLogging;// 1. 获取日志单例Logger &logger = Logger::instance();logger.setLoggingLevel(QsLogging::DebugLevel);// 2. 添加两个日志输出目的地DestinationPtr file_dest(DestinationFactory::MakeFileDestination("log.txt"));DestinationPtr console_dest(DestinationFactory::MakeDebugOutputDestination());logger.addDestination(file_dest);logger.addDestination(console_dest);// 3. 开始日志记录QLOG_DEBUG() << "Program started";return a.exec();
}
5. 运行程序

运行程序,控制台会输出日志,同时指定的文件也会记录日志内容。日志内容如下:

DEBUG 2024-09-19T18:07:04.434 Program started 
6. 启用行号和文件名

输出的日志记录默认是没有文件名和行号的,如果需要,在CMakeLists.txt.pro文件中添加宏定义即可。

CMakeLists.txt
# 开启行号
add_compile_definitions(QS_LOG_LINE_NUMBERS)
.pro 文件
# 开启行号
DEFINES += QS_LOG_LINE_NUMBERS
7. 禁用日志输出

如果要禁用日志输出,定义宏 QS_LOG_DISABLE 即可。

CMakeLists.txt
# 禁用日志输出
add_compile_definitions(QS_LOG_DISABLE)
.pro 文件
# 禁用日志输出
DEFINES += QS_LOG_DISABLE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540805.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

新通话,新突破!菊风荣获第七届“绽放杯”5G消息与新通话专题赛二等奖!

2024年9月9日&#xff0c;由中国信息通信研究院、中国通信企业协会主办的第七届“绽放杯”5G应用征集大赛5G消息及新通话专题赛决赛及颁奖仪式在西安富力希尔顿酒店成功举办。 PART 1 菊风荣获「绽放杯」二等奖 实力见证 荣耀加冕 经过初赛、复赛、决赛的层层选拔&#xff0c…

Prometheus - nVisual插件让运维更轻松

Prometheus 是一个开源的服务监控系统和时间序列数据库&#xff0c;常用于对基础设施的监控&#xff0c;监控范围涵盖了硬件层、操作系统层、中间件层、应用层等运维所需的所有监控指标类型&#xff0c;同时可利用第三方可视化工具Grafana实现时序数据的展示。然而&#xff0c;…

深度学习笔记17_TensorFlow实现咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.9 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a;TensorFlow 2.10.0 二、GPU设置…

96 kHz、24bit 立体声音频ADC芯片GC5358描述

概述&#xff1a; GC5358 是一款高性能、宽采样率、立体声音频模数转换器。其采样率范围是8KHz~96KHz&#xff0c;非常适合从消费级到专业级的音频应用系统。单端模拟输入不需要外围器件。GC5358 音频有两种数据格式&#xff1a;MSB对齐和 I2S 格式&#xff0c;和各种如 DTV、D…

移动技术开发:简单文本编辑器

1 实验名称 简单文本编辑器 2 实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法&#xff0c;以及事件监听处理的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:an…

Elasticsearch:检索增强生成背后的重要思想

作者&#xff1a;来自 Elastic Jessica L. Moszkowicz 星期天晚上 10 点&#xff0c;我九年级的女儿哭着冲进我的房间。她说她对代数一无所知&#xff0c;注定要失败。我进入超级妈妈模式&#xff0c;却发现我一点高中数学知识都不记得了。于是&#xff0c;我做了任何一位超级妈…

Java servlet《网吧机房管理系统浅析》

网吧机房管理系统在网吧运营中起着至关重要的作用。 对于用户而言&#xff0c;该系统提供了便捷的登录方式&#xff0c;通过用户名和密码可准确显示所在网吧机房号&#xff0c;便于快速定位。同时&#xff0c;合理的机房分配功能确保用户获得良好上网体验。遇到问题时&#xff…

两栏布局和三栏布局的实现方法

两栏布局 右侧不设置宽&#xff0c;实现一栏自适应。 1. float margin-left 左侧设置float&#xff0c;且设置宽度&#xff0c;右侧margin-left为左侧的宽度 <head><style>.left{width: 300px;height: 500px;background-color: palegreen;float: left;}.right…

AI 基础设施:构建AI时代全栈云计算体系

生成式AI 新时代下催生新的基础设施需求 随着企业在数字化转型之路上越走越远&#xff0c;期间一场新的技术革命正在发生&#xff0c;近几年涌现的生成式AI技术正在迅速改变科技、商业和整个社会的格局。这种强大的技术能够从数据中学习并生成预测性输出&#xff0c;生成式 AI …

使用chatgpt降低论文重复率的方法和需要注意的一些细节

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 要降低论文的重复率&#xff0c;可以借助ChatGPT进行多种方式的优化。以下是几种策略&#xff1a; 1. 重写段落或句子&#xff1a; 输入你认为可能重复率较高的段落或句子&#xff0c;…

前端JavaScript导出excel,并用excel分析数据,使用SheetJS导出excel

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

Windows通过网线传文件

文章目录 网线网络中看不到另一台计算机Nginx参考文献 网线 两台电脑用网线连接 电脑A 控制面板\网络和 Internet\网络和共享中心 → 更改适配器设置 → 右键以太网&#xff08;未识别的网络&#xff09; → 属性 → Internet 协议版本 4 (TCP/IPv4) 属性 → 使用下面的 IP …

SQL编程题复习(24/9/19)

练习题 x25 10-145 查询S001学生选修而S003学生未选修的课程&#xff08;MSSQL&#xff09;10-146 检索出 sc表中至少选修了’C001’与’C002’课程的学生学号10-147 查询平均分高于60分的课程&#xff08;MSSQL&#xff09;10-148 检索C002号课程的成绩最高的二人学号&#xf…

en造数据结构与算法C# 群组行为优化 和 头鸟控制

实现&#xff1a; 1.给鸟类随机播放随机动画使得每一只鸟扇翅膀的频率都不尽相同 2.可以自行添加权重&#xff0c;并在最后 sumForce separationForce cohesionForce alignmentForce;分别乘上相应权重&#xff0c;这样鸟就能快速飞行和转向辣 using System.Collections.Ge…

小程序地图展示poi帖子点击可跳转

小程序地图展示poi帖子点击可跳转 是类似于小红书地图功能的需求 缺点 一个帖子只能有一个点击事件&#xff0c;不适合太复杂的功能&#xff0c;因为一个markers只有一个回调回调中只有markerId可以使用。 需求介绍 页面有地图入口&#xff0c;点开可打开地图界面地图上展…

安全热点问题

安全热点问题 1.DDOS2.补丁管理3.堡垒机管理4.加密机管理 1.DDOS 分布式拒绝服务攻击&#xff0c;是指黑客通过控制由多个肉鸡或服务器组成的僵尸网络&#xff0c;向目标发送大量看似合法的请求&#xff0c;从而占用大量网络资源使网络瘫痪&#xff0c;阻止用户对网络资源的正…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第六集:制作小骑士完整的跳跃落地行为

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作一个完整的小骑士跳跃落地行为 1.制作动画以及UNITY编辑器编辑2.使用代码实现完整的跳跃落地行为控制3.更多要考虑到的点总结 前言 大家好久不见&…

基于MTL的多任务视频推荐系统

多任务学习&#xff0c;也就是MTL(Multi-task Learning)&#xff0c;现在已经被用在很多领域了&#xff0c;比如处理自然语言、搞计算机视觉&#xff0c;还有语音识别这些领域。MTL在大规模的推荐系统里也玩得挺溜&#xff0c;尤其是那些做视频推荐的大家伙。 MTL的玩法就是&a…

NLP 主要语言模型分类

文章目录 ngram自回归语言模型TransformerGPTBERT&#xff08;2018年提出&#xff09;基于 Transformer 架构的预训练模型特点应用基于 transformer&#xff08;2017年提出&#xff0c;attention is all you need&#xff09;堆叠层数与原transformer 的差异bert transformer 层…