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.mzph.cn/bicheng/50628.shtml

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

相关文章

CSS:position属性

一、属性值 1.1 fixed 固定位置的元素&#xff0c;相对于浏览器窗口进行定位。 元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定。 网站中的固定 header 和 footer 就是用固定定位来实现的&#xff1b; header效果图 footer效果图 1.2 absol…

浏览器自动化测试工具selenium——爬虫操作记录

selenium——是一款web自动化测试框架&#xff0c;其能模拟正常的用户操作&#xff0c;比如点击。但selenium并不是浏览器&#xff0c;没有执行js和解析html/css的能力&#xff0c;因此selenium需要和浏览器配合使用。 因为selenium可以模仿用户行为&#xff0c;因此selenium也…

Linux系统安装Cobol语言及IBM大型机模拟软件Hercules

COBOL&#xff08;Common Business-Oriented Language&#xff09;起源于50年代中期&#xff0c;是一种面向过程的高级程序设计语言&#xff0c;主要用于商业和数据处理领域。经过不断发展和标准化&#xff0c;已成为国际上应用最广泛的商业编程语言之一&#xff0c;在某red书上…

Windows Server搭建局域网NTP时间服务器与客户端通实现

1.服务器环境&#xff1a; win11更改注册表 winR输入regedit win11更改注册表 winR输入regedit 2.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config&#xff0c;找到Config目录&#xff0c;双击Config目录下的AnnounceFlags&#xff0c;设为5。 3.HKEY_L…

Nginx 配置与优化:常见问题全面解析

文章目录 Nginx 配置与优化:常见问题全面解析一、Nginx 安装与配置问题1.1 Nginx 安装失败问题描述解决方法1.2 Nginx 配置文件语法错误问题描述解决方法二、Nginx 服务启动与停止问题2.1 Nginx 无法启动问题描述解决方法2.2 Nginx 服务无法停止问题描述解决方法三、Nginx 性能…

Http 和 Https 的区别(图文详解)

在现代网络通信中&#xff0c;保护数据的安全性和用户的隐私是至关重要的。HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是两种常见的网络通信协议&#xff0c;但它们在数据保护方面的能力存在…

snkemake入门

一、背景介绍 snakemake是一种用于自动化流程的开源工具&#xff0c;是一款基于python3的软件。在生物信息学、高通量测序数据分析、大规模数据处理等领域非常流行。 snakemake的官网&#xff1a;Snakemake | Snakemake 8.16.0 documentationhttps://snakemake.readthedocs.i…

Android SurfaceFlinger——GraphicBuffer内存申请(三十)

在上一篇文章中介绍 GraphicBuffer 初始化的 initWithSize() 函数中,有两个核心方法,GraphicBufferAllocator.allocate 和 GraphicBufferMapper. getTransportSize,这里我们就来看一下 allocate() 函数是如何实现内存申请的。 一、函数介绍 在Android的图形子系统中,Graph…

自监督学习概述(Self-Supervised Learning,SSL)

自监督学习&#xff08;Self-Supervised Learning&#xff0c;SSL&#xff09;是一种机器学习方法&#xff0c;旨在利用未标记数据进行训练。这种方法通过从数据本身生成伪标签&#xff0c;来创建监督信号&#xff0c;使得模型能够学习有效的数据表示。自监督学习在深度学习领域…

C++ | Leetcode C++题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution { public:void moveZeroes(vector<int>& nums) {int n nums.size(), left 0, right 0;while (right < n) {if (nums[right]) {swap(nums[left], nums[right]);left;}right;}} };

第一周第三天任务

入职了新公司&#xff0c;电脑限制了公网访问&#xff0c;为了补上打卡进度&#xff0c;后面的打卡内容纯手敲文本&#xff0c;没有图片&#xff0c;不便之处请谅解&#xff0c;如果错误&#xff0c;请帮忙指正&#xff0c;谢谢。 11 使用docker-compose 使用一个工具&#x…

多通道音频解决方案

多通道音频解决方案在现代音频应用中具有广泛的应用&#xff0c;特别是在需要处理多个音频信号、实现复杂声音场景和提升用户体验的场合。比如音乐录制和影视和游戏音效设计等等。 音乐录制与制作音乐录制 需求: 音乐录制工作室需要能够同时录制和处理多个音轨&#xff0c;以便…

百度地图埋点动态插入到页面不生效, 定位发现是 document.write 缘故,不能异步引入该埋点 js

背景: 为提高页面加载速度, 根据地址的不同加载不同的 script (Vue 项目, 一份代码放到多个地址, 根据地址不同显示不同登录页), 结果引用的百度地图 api 失效 定位: 发现埋点 js 引入成功, 该 js 生成的内容是 document.write 再引入 js , css 文件, 这些文件没有加载出来 …

MathType 7.8中文直装版2024年最新图文安装破解教程

MathType公式编辑器 v7.8中文破解版是一款适用于Windows和Macintosh的便捷交互式公式编辑器&#xff0c;可帮助您进行文字处理、网页、桌面设计、演示文稿制作、学习TeX、LaTeX和MathML文档创建。 MathType 7.8这个工具允许用户创建、修改公式和插入多个文档。有了这个软件&…

​CSS技巧专栏:一日一例 13 -纯CSS实现晃晃悠悠背景不停滚动的按钮特效​

CSS技巧专栏:一日一例 13 -纯CSS实现晃晃悠悠背景不停滚动的按钮特效​ 大家好,本篇文章给大家带来一个可爱的按钮,像个小宠物等待你抚摸和奖励,不知道它会不会引起你的关注呢?页面上这样的一个按钮,会不会让你忍不住把鼠标移动过去点一下呢? 本例图片 案例分析 这个…

机械学习—零基础学习日志(高数12——反三角函数)

零基础为了学人工智能&#xff0c;真的开始复习高数 反三角函数很困难&#xff0c;但是当建立了逻辑链条&#xff0c;还是能快速理解的。这个办法就是笛卡尔坐标系。 三角函数与反三角函数的个人理解 sinx与cosx&#xff0c;tanx&#xff0c;secx&#xff0c;其实都可以放在…

白嫖游戏指南,Epic喜加一:《暗影火炬城》

前言 Epic喜加一&#xff1a;《暗影火炬城》《暗影火炬城》简介&#xff1a; 前言 接下来有时间会分享一些游戏相关可以白嫖的资源&#xff0c;包括游戏本体、游戏素材资源等等。 有需要的小伙伴可以关注这个专栏&#xff0c;不定期更新哦&#xff01; 专栏&#xff1a;白嫖…

数据库系统概述

文章目录 数据库基本概念内容重点数据库定义计算机三大主要应用领域 数据管理基础数据与信息数据处理与数据管理 数据库技术的产生、发展数据库系统的组成优势组成部分 数据模型概念类型 数据库三级模式和二级映射目的组成部分 数据库系统设计步骤小结 数据库基本概念 内容 信…

羊大师:夏夜贪凉,但为啥肚子还要‘保暖计划’?

在这个夏夜&#xff0c;当空调与风扇齐飞&#xff0c;冰镇西瓜与凉面共舞之时&#xff0c;你是否也曾有过这样的疑惑&#xff1a;明明热得汗流浃背&#xff0c;为啥老一辈总念叨着“睡觉再热也要给肚子盖被子”&#xff1f;这背后&#xff0c;藏着的可不仅仅是老一辈的固执&…

链路聚合加单臂路由

一、实验目的及拓扑 实验目的&#xff1a;在路由器及交换机之间建立链接聚合&#xff0c;交换机接入两台主机并通过路由器子接口自动分配IP地址&#xff0c;通过单臂路由实现两台主机互联 二、基本配置 1、交换机配置 [S1]vlan batch 10 20 [S1-Eth-Trunk1]dis th # interf…