开发平台 :
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..
}