Qt实现自动清理一周前log文件

为了避免源源不断的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();


}
发布了11 篇原创文章 · 获赞 3 · 访问量 2365

猜你喜欢

转载自blog.csdn.net/weixin_42108411/article/details/95902284