开发平台 :
Qt Creator
语言:
C++
需求:
- 获取日志信息,写入指定文件
- 日志7天后过期
- 保护写入日志进程
前置操作:
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;//互斥锁 QMutex mutex.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_DEBUG InitalizeLog(); //自定义日志输出 qInstallMessageHandler(LogMessageHandler); #endif //other.. //other.. //other.. //other.. }