Qt自定义日志输出

Qt自定义日志输出

简略版:

#include <QApplication>
#include <QDebug>
#include <QDateTime>
#include <QFileInfo>
// 将日志类型转换为字符串
QString typeToString(QtMsgType type) {switch (type) {case QtDebugMsg: return "Debug";case QtInfoMsg: return "Info";case QtWarningMsg: return "Warning";case QtCriticalMsg: return "Critical";case QtFatalMsg: return "Fatal";default: return "Unknown";}
}
void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {// 当前时间,只保留到秒QString timeText = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");// 简化文件名,只显示文件名,不显示路径QString file(context.file ? context.file : "no-file");file = QFileInfo(file).fileName();// 构建简化的日志信息QString formattedMessage = QString("%1 [%2] (%3:%4): %5").arg(timeText).arg(typeToString(type)).arg(file).arg(context.line).arg(msg);// 输出到控制台fprintf(stderr, "%s\n", formattedMessage.toLocal8Bit().constData());
}
int main(int argc, char *argv[]) {QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);qInstallMessageHandler(customMessageHandler);QApplication a(argc, argv);return QApplication::exec();
}

效果图:

在这里插入图片描述

详细版:

#include <QApplication>
#include <QPushButton>
#include <QDebug>
#include "gamepanel.h"
#include <QDateTime>
#include <QFileInfo>void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {// 当前时间QString timeText = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");// 构建日志信息QByteArray localMsg = msg.toLocal8Bit();const char* file = context.file ? context.file : "no-file";const char* function = context.function ? context.function : "no-function";switch (type) {case QtDebugMsg:fprintf(stderr, "%s [Debug] (%s:%u, %s): %s\n", timeText.toLocal8Bit().constData(), file, context.line, function, localMsg.constData());break;case QtInfoMsg:fprintf(stderr, "%s [Info] (%s:%u, %s): %s\n", timeText.toLocal8Bit().constData(), file, context.line, function, localMsg.constData());break;case QtWarningMsg:fprintf(stderr, "%s [Warning] (%s:%u, %s): %s\n", timeText.toLocal8Bit().constData(), file, context.line, function, localMsg.constData());break;case QtCriticalMsg:fprintf(stderr, "%s [Critical] (%s:%u, %s): %s\n", timeText.toLocal8Bit().constData(), file, context.line, function, localMsg.constData());break;case QtFatalMsg:fprintf(stderr, "%s [Fatal] (%s:%u, %s): %s\n", timeText.toLocal8Bit().constData(), file, context.line, function, localMsg.constData());abort(); // 此调用将终止程序}
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 安装日志处理函数qInstallMessageHandler(customMessageHandler);// 生成日志消息qDebug() << "hello,world";return a.exec();
}

效果图

在这里插入图片描述

注意事项:

  • 需要在main函数安装日志处理函数: qInstallMessageHandler(customMessageHandler);,安装这个函数以后,整个项目全局使用,不需要再重新安装

  • 可以再CMakeLists.txt中添加以下设置用于控制日志是否输出,如果不禁止注释掉即可

    add_definitions(-DQT_NO_DEBUG_OUTPUT) //禁用调试输出
    add_definitions(-DQT_NO_INFO_OUTPUT) //禁用信息级别的日志输出
    add_definitions(-DQT_NO_WARNING_OUTPUT) //禁用警告级别的日志输出
    

使用:

以下是详细版的修改版本,只保存主要的信息

我们可以创建一个命名空间用于存放这个自定义日志输出

  • Logger.h
#ifndef MYLANDLARDS_SRC_LOGGER_H
#define MYLANDLARDS_SRC_LOGGER_H#include <QString>
#include <QMessageLogContext>namespace Logger {
void customMessageHandler(QtMsgType type,const QMessageLogContext &context,const QString &msg);
QString typeToString(QtMsgType type);
}#endif //MYLANDLARDS_SRC_LOGGER_H
  • Logger.cpp
#include "Logger.h"
#include <QDateTime>
#include <QFileInfo>
#include <cstdio>namespace Logger {void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {QString timeText = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");QString file = QFileInfo(context.file ? context.file : "no-file").fileName();QString function = context.function ? context.function : "no-function";QString formattedMessage = QString("%1 [%2] (%3:%4, %5): %6").arg(timeText).arg(typeToString(type)).arg(file).arg(context.line).arg(function).arg(msg);fprintf(stderr, "%s\n", formattedMessage.toLocal8Bit().constData());
}QString typeToString(QtMsgType type) {switch (type) {case QtDebugMsg: return "Debug";case QtInfoMsg: return "Info";case QtWarningMsg: return "Warning";case QtCriticalMsg: return "Critical";case QtFatalMsg: return "Fatal";default: return "Unknown";}
}} // namespace Logger
  • main.cpp
#include <QApplication>
#include <QDebug>
#include "Logger.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);qInstallMessageHandler(Logger::customMessageHandler);qDebug() << "hello,world";return QApplication::exec();
}

效果图:

在这里插入图片描述

如果最后需要将日志输出到文件中,可以叫ChatGPT修改即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

make menuconfig 分析

文章目录 make menuconfig V1 make menuconfig V1 make menuconfig V1&#xff1a; 1 make -f ./scripts/Makefile.build objscripts/basic 2 cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -stdgnu11 -o scripts/basic…

嵌入式系统编程、FPGA编程、驱动程序开发

以下是一些关于硬件开发代码的关键点和示例&#xff1a; 1. 嵌入式系统编程 语言&#xff1a;C 和 C 是嵌入式系统编程中最常用的语言&#xff0c;但也有一些系统使用汇编语言或其他特定于硬件的语言。示例&#xff1a;一个简单的LED闪烁程序&#xff08;基于C语言&#xff0…

Mysql的联合索引

一、前言 上一篇中已经讲过了索引相关的知识&#xff0c;为什么还要在讲一下联合索引&#xff08;二级索引&#xff09;&#xff0c;是因为这个知识点特别重要&#xff0c;不论是在面试中&#xff0c;还是在实际的使用过程中&#xff0c;理解和掌握联合索引&#xff0c;是我们…

回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测

回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测 目录 回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-ESN基于灰狼算法优化回声状态…

vscode设置成中文界面

在Visual Studio Code&#xff08;VSCode&#xff09;中设置中文界面&#xff0c;你可以采用以下几种方法&#xff0c;以下是详细步骤&#xff1a; 方法一&#xff1a;通过设置菜单设置中文 打开VSCode&#xff1a;首先&#xff0c;确保你已经打开了VSCode软件。进入设置&…

DevOps学习回顾01-技能发展路线-岗位能力-体系认知(射箭和拉弓的区别)

事为先&#xff0c;人为重–事在人为 参考来源&#xff1a; 极客时间专栏&#xff1a;DevOps实战笔记&#xff0c;作者&#xff1a;石雪峰 课程链接&#xff1a;https://time.geekbang.org/column/intro/235 时代的典型特征 VUCA VUCA 是指易变性&#xff08;Volatility&…

关于MySQL 中的全局事务标识符GTID

目录 1.GTID 的管理2.GTID 的影响3.GTID 的自动清理二进制日志的过期和清除GTID 的清理保证数据一致性GTID 执行点的维护 4.结论 MySQL 中的全局事务标识符&#xff08;GTID&#xff09;确实会随着事务的不断执行而增长&#xff0c;但这并不意味着它会无限增长而导致问题。GTID…

【MySQL】聊聊数据库是如何保证数据不丢的

对于一个存储系统来说&#xff0c;其中比较关键的核心组件包含&#xff0c;网络、存储模型、持久化、数据结构等。而数据如何保证不丢失&#xff0c;对于不同的存储系统来说&#xff0c;比如Redis采用AOF和RDB的方式进行混合使用&#xff0c;而MySQL采用日志进行保证。也就是re…

MyBatis使用Demo

文章目录 01、Mybatis 意义02、Mybatis 快速入门04、Mapper 代理开发05、Mybatis 配置文件07、查询所有&结果映射08、查询-查看详情09、查询-条件查询10、查询-动态条件查询多条件动态查询单条件动态查询 11、添加&修改功能添加功能修改功能 12、删除功能删除一个批量删…

ubuntu 18.04 安装vnc

如何在Ubuntu 18.04安装VNC | myfreax sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils sudo apt install tigervnc-standalone-server tigervnc-common vncserver sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils sudo apt ins…

Redis 键(key)

Redis 键(key) Redis是一种高性能的键值对数据库&#xff0c;它支持多种类型的数据结构&#xff0c;如字符串、列表、集合、散列表等。在Redis中&#xff0c;键(key)是数据存储的基础&#xff0c;每个键都关联着一个值(value)。本文将详细介绍Redis中的键(key)相关知识&#x…

滴滴出行 大数据研发实习生【继任】

大数据研发实习生JD 职位描述 1、负责滴滴核心业务的数据建设&#xff0c;设计并打造适应滴滴一站式出行平台业务特点的数仓体系。 2、负责抽象核心业务流程&#xff0c;沉淀业务通用分析框架&#xff0c;开发数仓中间层和数据应用产品。 3、负责不断完善数据治理体系&#xff…

Excel报表

(Apache POI) 入门案例 P164 使用POI需要导入下面2个坐标&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId> </dependency> <dependency><groupId>org.apache.poi</groupId>&…

基于Python的数据可视化大屏的设计与实现

基于Python的数据可视化大屏的设计与实现 Design and Implementation of Python-based Data Visualization Dashboard 完整下载链接:基于Python的数据可视化大屏的设计与实现 文章目录 基于Python的数据可视化大屏的设计与实现摘要第一章 导论1.1 研究背景1.2 研究目的1.3 研…

uni-app 小程序:显示图片并且点击图片展示大图

效果如图所示&#xff1a; 在页面显示一张图片&#xff0c;然后点击该张图片后显示大图。点击大图就可以关闭大图。 实现的主要代码如下&#xff1a; <image :src"imgpath" mode"aspectFill" click"imgPreview(imgArr)"></image> 其…

Spring Web MVC之过滤器Filter和拦截器HandlerInterceptor的区别和用法

作用时机不一样 Spring 框架有一个很重要的类DispatcherServlet。这个类继承了HttpServlet&#xff0c;HttpServlet实现了Servlet接口。相当于图片中的Servlet。所有和Spring框架相关配置&#xff0c;例如注解、xml配置、其他数据库连接配置、bean配置、拦截器配置等其他配置&…

CleanMyMacX4.15.4如何优化苹果电脑系统缓存,告别MacBook卡顿,提升mac电脑性能

你是否曾为苹果电脑存储空间不够而烦恼&#xff1f;是否曾因系统运行缓慢而苦恼&#xff1f;别担心&#xff0c;今天我要给大家种草一个神器——CleanMyMac&#xff01;这款软件可以帮助你轻松解决苹果电脑的种种问题&#xff0c;让你的电脑焕然一新&#xff01; 让我来给大家介…

【iOS】编译二进制文件说明

编译二进制文件说明 如何生成文件路径文件说明第一部分&#xff1a;.o文件第二部分&#xff1a;link第三部分&#xff1a;Segment第四部分&#xff1a;Symbol 如何生成 使用Xcode进行编译 &#xff0c;会生成二进制相关文件&#xff0c;可以更详细看产物的布局 项目Target -&…

Python烟雾液体弹性力微分模拟 | 出租车往返速度微分计算

&#x1f3af;要点 &#x1f3af;弹性连续力学 | &#x1f3af;弱可压缩液体 | &#x1f3af;不可压缩流体&#xff08;烟雾&#xff09;| &#x1f3af;高度场浅水波动 | &#x1f3af;质量弹簧系统地面碰撞 | &#x1f3af;前向欧拉方法台球刚体运动&#xff0c;动量和动能守…

区块链之快照

定义 区块链快照是区块链技术中一个非常重要的概念,它可以帮助区块链系统提高性能和数据管理效率。 什么是区块链快照 区块链快照是指在某个时间点对整个区块链的状态进行保存和备份的过程。 快照会记录区块链上所有账户的余额、合约状态等信息,并将其序列化存储起来。 这样…