为了避免源源不断的log文件,占据客户存储空间,因此需要实现自动清理log文件的功能。
具体实现:
#include <QString>
#include <QFile>
#include <QApplication>
#include <QDateTime>
#include <QFile>
#include <QTextStream>
#include <QDir>
#include <string.h>
#include "mainwindow.h"
const int mounth_days[12]=
/* 1 2 3 4 5 6 7 8 9 10 11 12*/
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//此处定义每月的天数
/*将对应的日期换算成天数,因此1月是0天,2月是31天,3月是0+21+28天以此类推
在下面会为数组填充数据*/
int mounth_days_add[12];
/*该函数具体实现了输出打印debug文件的功能*/
void customLogMessageHandler(QtMsgType type, const QMessageLogContext& ctx ,const QString& msg)
{
QString txt;
QDir dir;
QDateTime time = QDateTime::currentDateTime();
QString timeStr = time.toString("yyyy-MM-dd hh:mm:ss");//此处的时间格式用于log文件
QString dataStr = time.toString("yyyy-MM-dd");//此处时间格式用于debug文件的命名
switch (type)
{
case QtDebugMsg:
txt = QString("Debug:(%1) <%2> [%3] {%4}").arg(timeStr).arg(ctx.file).arg(ctx.line).arg(msg);
break;
case QtWarningMsg:
txt = QString("Warning:(%1) <%2> [%3] {%4}").arg(timeStr).arg(ctx.file).arg(ctx.line).arg(msg);
break;
case QtCriticalMsg:
txt = QString("Critical:(%1) <%2> [%3] {%4}").arg(timeStr).arg(ctx.file).arg(ctx.line).arg(msg);
break;
case QtFatalMsg:
txt = QString("Fatal:(%1) <%2> [%3] {%4}").arg(timeStr).arg(ctx.file).arg(ctx.line).arg(msg);
break;
default:
break;
}
QFile outFile(dataStr+"debug.txt");//未指明文件存放地址 则为程序根目录
outFile.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream ts(&outFile); //缓冲流,存放打印信息
ts << txt << endl;//输出信息,类似于cout
}
void debugLog_delete()
{
QDir dir(QDir::current());//程序当前目录,qt下该目录取决于构建时的debug存放地址
QStringList filters;//设置过滤器
filters<<"*.txt";//过滤留下txt文件
dir.setNameFilters(filters);
QList<QString> dataList; //用来存放从log文件名获取到的日期
QDateTime data = QDateTime::currentDateTime();//获取当前时间
QString dataStr = data.toString("yyyy-MM-dd");//时间格式转换
/*初始化月份累加天数*/
/*1月0天 2月31天 3月31+28天 ...*/
for(int i =0 ;i<12; i++)
{
if(i==0)
{
mounth_days_add[i] = 0;
}
else
{
mounth_days_add[i]=mounth_days[i-1]+mounth_days_add[i-1];
}
}
//循环遍历,在Qlist中存取文件名
foreach (QFileInfo mItem, dir.entryInfoList())
{
dataList<<mItem.fileName();
}
//将当天日期换算为天数
int currentDate_value =
mounth_days_add[dataStr.mid(5,2).toInt()-1]+dataStr.mid(8,2).toInt();
for(int i=0; i<dataList.count();i++)
{
//从获取到文件名中,读取日期,将日期换算成天数,大于7天的删除
if((currentDate_value - (mounth_days_add[dataList.at(i).mid(5,2).toInt()-1]+dataList.at(i).mid(8,2).toInt()))>7)
{
qDebug()<<"overdue debug file :"<<dataList.at(i);
if(QFile::exists(dataList.at(i)))
{
qDebug()<<dataList.at(i)<<"deubg file txt exist , removing...";
QFile::remove(dataList.at(i));
qDebug()<<dataList.at(i)<<"file txt removed";
}
}
}
}
int main(int argc, char *argv[])
{
QApplication a(argc,argv);
debugLog_delete();
qInstallMessageHandler(customLogMessageHandler); //intsall log函数
return a.exec();
}