您的位置:首页 > 汽车 > 新车 > Qt实现输出日志到指定文件

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

2024/9/8 10:31:03 来源:https://blog.csdn.net/intwei/article/details/140698377  浏览:    关键词: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..
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com