在开发QT程序的时候,很多开发者也就仅仅用QT的日志模块qDebug一下调试信息,在真正的日志记录上还是采用一些别的日志库。其实QT的日志模块还是很强大的,可以满足日常的基本需求。这里就详细介绍一下QT日志模块的个性化使用方法。

格式化日志输出

默认情况下,日志格式是只输出对应的日志内容没有额外信息的。我们可以通过修改环境变量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格式

格式化日志的调用方法如下:

int main(int argc,char*argv[])
{QCoreApplication app(argc, argv);qSetMessagePattern("%{time yyyy-MM-dd hh:mm:ss}--[%{type}]--%{function}:%{message}");qDebug() << "exception occured";qInfo() <<  "call other function";return app.exec();
}

输出的日志内容格式如下:

2022-06-09 10:09:54--[debug]--main:exception occured
2022-06-09 10:09:55--[info]--main:call other function

我们还可以使用条件变量

%{if-debug}, %{if-info} %{if-warning}, %{if-critical} or %{if-fatal}

给不同级别的日志指定不同的格式,使用方法如下:

int main(int argc,char*argv[])
{QCoreApplication app(argc, argv);//针对Warning信息和Fatal信息输出了额外的内容qputenv("QT_MESSAGE_PATTERN", QByteArray("%{time yyyy-MM-dd hh:mm:ss} [%{type}]%{if-warning}[%{function}]%{endif}%{if-fatal}[%{function}--%{line}]%{endif}:%{message}"));qDebug() << "debuginfo occured";qInfo() <<  "call other function";qWarning() << "doesn't work";qFatal("fatal error");return app.exec();
}

输出的日内容如下:

2022-06-09 10:48:32 [debug]:debuginfo occured
2022-06-09 10:48:32 [info]:call other function
2022-06-09 10:48:32 [warning][main]:doesn't work
2022-06-09 10:48:32 [fatal][main--116]:fatal error

我们可以通过修改QT_MESSAGE_PATTERN环境变量动态的修改日志的输出格式。如果同时调用qSetMessagePattern和QT_MESSAGE_PATTERN环境变量来修改日志的输出格式,那么QT_MESSAGE_PATTERN的优先级要高于qSetMessagePattern。

输出日志到文本

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

//日志消息的处理函数
void logmessageHander(QtMsgType type, const QMessageLogContext& context, const QString& message)
{//获取格式化的日志信息QString typeStr = qFormatLogMessage(type,context,message);//可以根据日志的级别进行过滤QString levelText;switch (type) {case QtDebugMsg:levelText = "Debug";break;case QtInfoMsg:levelText = "Info";break;case QtWarningMsg:levelText = "Warning";break;case QtCriticalMsg:levelText = "Critical";break;case QtFatalMsg:levelText = "Fatal";break;}QFile file("myapp.log");file.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream textStream(&file);textStream << typeStr << endl;
}
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(logmessageHander);qDebug() << "debuginfo occured";qInfo() <<  "call other function";qWarning() << "doesn't work";qFatal("fatal error");return app.exec();
}

如果需要关闭日志输出,取消之前注册的日志处理函数,我们可以调用

//取消注册的日志处理函数
qInstallMessageHandler(0);

日志输出对象信息

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

//消费者信息类
struct Customer {QString name;int age;QString clientid;QString addr;
};QDebug operator<<(QDebug debug, const Customer& customer)
{//保存QDebug的状态QDebugStateSaver saver(debug);debug.nospace() << "("<< "name: " << customer.name << ","<< "age: " << customer.age  << ","<< "clientid: " << customer.clientid  << ","<< "addr: " << customer.addr  << ","<< ")";return debug;
}int main(int argc,char*argv[])
{QCoreApplication app(argc, argv);Customer customer = { "Liming", 22, "677888", "北京市海淀区"};qDebug() << "Customer info" << customer;return app.exec();
}

QDebugStateSaver类可以保存QDebug的配置,并在销毁的时候自动恢复。使用它我们可以避免在操作符重载的时候破坏QDebug中的配置。

QT日志模块的个性化使用相关推荐

  1. 日志模块 logging

    举例:# 1.办公室# 2.负责往控制台里面输出日志信息的# 3.往日志文件里面写日志的,按天生成日志,清理日志 import logging #导入日志模块 from logging import ...

  2. day31 logging 日志模块

    1 # logging 日志模块 ****** 2 # 记录用户行为或者代码执行过程 3 # print 来回注释比较麻烦的 4 # logging 5 # 我能够"一键"控制 6 ...

  3. Python之配置日志模块logging

    一.定义日志打印方式 如果我们运行自己的程序,有时候需要记录程序运行过程中出现的问题或者信息.可以运用日志模块logging来记录,该模块日志格式可以根据用户需求来自己定义. 常见打印日志信息形式如下 ...

  4. python logging模块的作用_Python 日志模块logging分析及使用-2

    本文作为Python日志模块的补充,主要介绍日志回滚RotatingFileHandler和TimedRotatingFileHandler的使用,以及其所带来的问题.Logger对象的日志等级是如何 ...

  5. apollo mqtt linux qt,MQTT第5版更新,以及如何应用到Qt MQTT模块中

    之前我曾写过在MQTT消息中的topic可能会对发布的数据量产生较大影响.从那之后,MQTT已经发布了第5版标准并且诞生了第一个实现.当然,Qt MQTT也随之跟进,这篇文章将介绍Qt for Aut ...

  6. DPDK — RTE_LOG 日志模块

    目录 文章目录 目录 DPDK 的日志系统 RTE_LOG 宏 rte_log 和 rte_vlog 函数 日志模块初始化 第一阶段初始化 第二阶段初始化 注册新的日志类型 复用现有日志类型 参考文档 ...

  7. Python的日志模块logging的使用

    Python的日志模块logging的使用 1 logging模块介绍 2 logging 简单示例 3 logging.basicConfig() 4 logging组件 4.1 Logger类 4 ...

  8. openresty开发系列36--openresty执行流程之6日志模块处理阶段

    openresty开发系列36--openresty执行流程之6日志模块处理阶段 一)header_filter_by_lua 语法:header_filter_by_lua <lua-scri ...

  9. 微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog

    前言 mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业务性无关,平台性无关的基础组件.目前已接入微信 Android.iOS.Mac.Windows.WP 等客户端.现正在筹备开源中, ...

最新文章

  1. native react 更新机制_深度使用react-native的热更新能力,必须知道的一个shell命令...
  2. Xcode学习C++(三、const)
  3. C++知识回顾之__stdcall、__cdcel和__fastcall三者的区别
  4. Java DO到DTO转换利用spring 的BeanUtils.copyProperties
  5. C# DataSet和DataTable详解
  6. SCOM 2007 R2安装部署各组件支持的操作系统详细列表
  7. C++--第21课 - 类模板 - 上
  8. SQL Server 2017 安装AdventureWorks示例数据库出现的问题
  9. mysql 导出 客户端_MySQL 导出数据 导入数据
  10. vue 播放m3u8视频
  11. Python 进阶视频课 - 12. Nelson-Siegel 构建债券收益率曲线
  12. 驾照考试之科目三(深圳东周版)
  13. leetcode——第322题——零钱兑换
  14. mysql 去除全角空格_去掉全角空格
  15. 雨林木风 Ghost XP SP2 精简版 Y2.0
  16. 对残差网络resnet shortcut的解释
  17. WebRTC音视频原理
  18. android 百度地图 自定义地图标注,百度地图自定义标注
  19. 电池工况测试 matlab,一种电动汽车用动力蓄电池脉冲工况测试方法与流程
  20. 如何成功抵御DOS攻击?给你介绍四种方法

热门文章

  1. java输入字符串并将每个字符输出
  2. 免费|大学生必备软件,总有一款适合你
  3. 传统呼叫中心系统与智能电销外呼系统的主要区别是什么?
  4. 放开那三国3服务器维护,放开那三国3渠道服
  5. [Apple Push] 【苹果推】Appletexter
  6. java小知识课前演讲_演讲技巧小贴士---记录
  7. php 拼音简称类搜索,前端搜索城市(包括拼音和缩写)
  8. 计算机键盘电容传感器,12路电容式触摸传感器键盘 IIC接口单键触摸键盘传感器模块...
  9. Vue中路由守卫的具体应用
  10. 十大经典排序算法动画与解析,看我就够了!(附代码)