Qt实现输出日志到指定文件

开发平台 :

Qt Creator

语言:

C++

需求:

  1. 获取日志信息,写入指定文件
  2. 日志7天后过期
  3. 保护写入日志进程

前置操作:

1.在CMakeLists.txt中添加如下代码

# 添加预处理,防止在release模式下,输出的日志信息不显示文件名,行号等信息
add_definitions(-DQT_MESSAGELOGCONTEXT)

2.创建LogManage.h 和 LogManage.cpp

具体代码:

LogManage.h

#pragma once#include <QApplication>
#include <QtDebug>
#include <QFile>
#include <QTextStream>
#include <qdatetime.h>//初始化
void InitalizeLog();
//获取日志存储目录路径
QString getLogFilePath();
//日志处理
void LogMessageHandler(QtMsgType type,const QMessageLogContext &context, const QString &messages);

LogManage.cpp

#include "src/LogManage.h"
#include <qdir.h>
#include <QDateTime>
#include <QFileInfoList>
#include <qfileinfo.h>
#include <QMutex>void InitalizeLog()
{//1. 预设日志目录并检查是否创建QString path = getLogFilePath();QDir dir(path);if(!dir.exists()){dir.mkdir(path);}//2. 日志7天后过期逻辑QDateTime last_time = QDateTime::currentDateTime().addDays(-7);QFileInfoList infoList = dir.entryInfoList();for(QFileInfo info : infoList){if(info.fileName() == "." || info.fileName() == ".."){continue;}if(last_time.secsTo(info.birthTime()) < 0){//secsTo: 差多少秒到info.dir().remove(info.fileName());}}
}void LogMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message)
{//1. 加锁,保护进程static QMutex mutex;//互斥锁 QMutexmutex.lock();//2. 日志信息生成及处理/*** 1.日志消息类型 ***/QString m_type("");switch (type) {case QtDebugMsg:m_type = QString("Debug");break;case QtInfoMsg:m_type = QString("Info");break;case QtWarningMsg:m_type = QString("Warning");break;case QtCriticalMsg:m_type = QString("Critical");break;case QtFatalMsg:m_type = QString("Fatal");break;}/*** 2.日志消息 ***/QByteArray m_message = message.toUtf8();/*** 3.日志生成日期 ***/QString m_date = QDateTime::currentDateTime().toString("yyyy-mm-dd hh:mm::ss");/*** 4.日志所在文件&行 ***/QString m_file = context.file;int m_line = context.line;QString m_log = QString("[%1]-<文件:%2    所在行:%3    日期:%4> ----------------- %5").arg(m_type).arg(m_file).arg(m_line).arg(m_date).arg(m_message);//3. 日志写入预设文件QString m_filePath = getLogFilePath();QString m_fileName = QDate::currentDate().toString("yyyy-MM-dd");m_fileName += ".txt";m_fileName = m_filePath + "/" + m_fileName;m_fileName = QDir::toNativeSeparators(m_fileName);QFile file(m_fileName);file.open(QIODevice::ReadWrite | QIODevice::Append);QTextStream stream(&file);stream<< m_log << "\r\n";file.flush(); //直接将缓冲中的内容写入文件file.close();//4. 解锁mutex.unlock();
}QString getLogFilePath()
{QString str = qApp->applicationDirPath();str = str.left(str.lastIndexOf("/"));str += "/myLog";str = QDir::toNativeSeparators(str);//toNativeSeparators: 转到本地分隔符return str;
}

main.cpp

int main(int argc, char *argv[])
{
//release模式下启动日志文件输出
#ifdef QT_NO_DEBUGInitalizeLog();//自定义日志输出qInstallMessageHandler(LogMessageHandler);
#endif
//other..
//other..
//other..
//other..
}

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

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

相关文章

C++第十弹 ---- vector的介绍及使用

目录 前言vector的介绍及使用1. vector的使用1.1 vector的定义1.2 iterator的使用1.3 vector空间增长问题1.4 vector增删查改 2. vector迭代器失效问题(重点) 总结 前言 本文介绍了C中的vector数据结构及其使用方法。 更多好文, 持续关注 ~ 酷酷学!!! 正文开始 vector的介绍…

基本类型的包装类,面向对象三大特性,继承(inherit).一道力扣分享。

>>>基本类型的包装类 拆包–>封包 拆包–>包装类型转换为基本数据类型 封包—>基本数据类型转换为包装类型 编号基本数据类型包装类型1byteByte2shortShort3charCharacter4intInteger5longLong6floatFloat7doubleDouble8booleanBoolean 为何要用包装类型…

【echarts】中如何设置曲线展示最新值、最大值、最小值

需要用到的属性&#xff1a;图表标注 series-line. markPoint 默认可以通过 type直接标注&#xff1a;‘min’ 最小值、‘max’ 最大值、‘average’ 平均值。 markPoint: {data: [{type: max},{type: min}]}如何展示最新值 如果要展示最新值得话&#xff0c;需要设置 标注…

昇思25天学习打卡营第19天|DCGAN生成漫画头像

DCGAN生成漫画头像总结 实验概述 本实验旨在利用深度卷积生成对抗网络&#xff08;DCGAN&#xff09;生成动漫头像&#xff0c;通过设置网络、优化器以及损失函数&#xff0c;使用MindSpore进行实现。 实验目的 学习和掌握DCGAN的基本原理和应用。熟悉使用MindSpore进行图像…

Vue3时间选择器datetimerange在数据库存开始时间和结束时间

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

[算法]归并排序(C语言实现)

一、归并排序的定义 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。 二、归并排序的算法原理 归并排序的算法可以用递归法和非递归法来实现…

介绍一下TCP/IP 模型和 OSI 模型的区别

OSI 模型是由国际标准化组织制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;一共有七层&#xff0c;由上而下分别为应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层和物理层&#xff0c;虽然 OSI 模型理论…

华为网络模拟器eNSP安装部署教程

eNSP是图形化网络仿真平台&#xff0c;该平台通过对真实网络设备的仿真模拟&#xff0c;帮助广大ICT从业者和客户快速熟悉华为数通系列产品&#xff0c;了解并掌握相关产品的操作和配置、提升对企业ICT网络的规划、建设、运维能力&#xff0c;从而帮助企业构建更高效&#xff0…

Geoscene Pro的数据管理

GeoScene Pro是为新一代WebGIS平台而全新打造的一款具有高效、强大生产力且为全面国产的的高级桌面应用程序&#xff0c;可以对来自本地、GeoScene Online、或者GeoScene Portal的数据进行可视化、编辑、分析&#xff0c;可以同时在2D和3D中制作内容&#xff0c;并发布为要素服…

医疗器械维修行业发展及趋势

医疗器械维修的前景是广阔的。‌ 随着医疗技术的不断发展和进步&#xff0c;‌医疗器械的种类和数量持续增加&#xff0c;‌对专业维修人员的需求也在不断上升。‌无论是医院、‌诊所等医疗机构&#xff0c;‌还是医疗器械生产企业、‌销售企业等&#xff0c;‌都需要专业的维修…

Spark+实例解读

第一部分 Spark入门 学习教程&#xff1a;Spark 教程 | Spark 教程 Spark 集成了许多大数据工具&#xff0c;例如 Spark 可以处理任何 Hadoop 数据源&#xff0c;也能在 Hadoop 集群上执行。大数据业内有个共识认为&#xff0c;Spark 只是Hadoop MapReduce 的扩展&#xff08…

C语言常见字符函数和字符串函数精讲

目录 引言 一、字符函数 1.字符分类函数 2.字符转换函数 二、字符串函数 1.gets、puts 2.strlen 3.strcpy 4.strncpy 5.strcat 6.strncat 7.strcmp 8.strncmp 9.strstr 10.strchr 11.strtok 12.strlwr 13.strupr 引言 在C语言编程中&#xff0c;字符函数…

Rancher 快照备份至 S3 及备份恢复

AWS S3&#xff08;Simple Storage Service&#xff09;是亚马逊云服务提供的一种高度可扩展、安全且经济高效的对象存储服务。它允许用户在任何位置存储和检索任意数量的数据,非常适合存储和分发静态文件、备份数据以及作为数据湖的存储层。 集群备份 一、创建S3桶 1、登录…

PyTorch学习(1)

PyTorch学习&#xff08;1&#xff09; CIFAR-10数据集-图像分类 数据集来源是官方提供的&#xff1a; torchvision.datasets.CIFAR10()共有十类物品&#xff0c;需要用CNN实现图像分类问题。 代码如下&#xff1a;(CIFAR_10_Classifier_Self_1.py) import torch import t…

【Linux】玩转操作系统,深入刨析进程状态与调度机制

目录 1. 进程排队2. 进程状态的表述2.1. 进程状态2.2 运行状态2.3. 阻塞状态2.4. 挂起状态 3. Linux下具体的进程状态3.1. 运行状态R3.2. 可中断睡眠状态S3.3. 不可中断睡眠状态D3.4. 停止状态T3.5. 死亡状态X3.6. 僵尸状态Z 4. 孤儿进程5. 优先级6. Linux的调度与切换6.1. 四个…

打破自闭症束缚:儿童康复案例揭秘

在浩瀚的康复领域中&#xff0c;有这样一所机构&#xff0c;它如同温暖的阳光&#xff0c;穿透自闭症的阴霾&#xff0c;为无数家庭带来了希望与光明。这&#xff0c;就是星启帆——国内规模较大的全寄宿制自闭症儿童康复机构&#xff0c;一个专注于中重度广泛性发育障碍儿童康…

ffmpeg更改视频的帧率

note 视频帧率调整 帧率(fps-frame per second) 例如&#xff1a;原来帧率为30&#xff0c;调整后为1 现象&#xff1a;原来是每秒有30张图像&#xff0c;调整后每秒1张图像&#xff0c;看着图像很慢 实现&#xff1a;在每秒的时间区间里&#xff0c;取一张图像…

MySQL之视图和索引

新建数据库 插入数据 处理表 1. 2. 3. mysql> alter table sc add unique index SC_INDEX (sno asc,cno asc); 4. mysql> create view stu_info as select student.sno,ssex,sc.cno,score from student join sc on student.snosc.sno; 5. mysql> drop index S…

JavaScript——变量与运算符、输入输出、判断、循环

文章目录 前言概述使用 js从文件引入 js 代码importjs 的作用变量计算输入格式化输出保留小数向上取整&#xff0c;向下取整条件判断循环总结 前言 为了监督自己的进度&#xff0c;把学习任务一点点都写出来&#xff0c;写多少就算多少&#xff0c;不求完美&#xff0c;只求完…

Adobe正通过数字体验改变世界

在当今这个数字化飞速发展的时代&#xff0c;Adobe公司正以其创新的技术和卓越的产品引领着创意设计领域的变革。从Adobe发布的生成式AI工具&#xff08;Adobe Firefly&#xff09;&#xff0c;到Illustrator和Photoshop的新AI功能&#xff0c;再到广受认可的Adobe国际认证&…