Qt 【导出log到文件】

在Qt开发过程当中经常使用qDebug等一些输出来调试程序,但是到了正式发布的时候,都会被注释或者删除,采用日志输出来代替。

以下demo实现的功能:

  • 将调试的log信息输出到文件
  • log文件保存位置:当前程序运行的路径->debugs文件夹
  • 实时log文件为debug.log文件,当该文件大小超过20M时,按照时间重命名该文件。
  • debugs文件夹中的文件达到最大规定的数量时,删除多余的log文件。

Demo

  • logOutput.cpp
#include <QDebug>
#include <QMutex>

class LogOutput:public QThread /*继承QThread类,使log输出另起线程,不干扰主线程*/
{
protected:
    void run();/*复写QThread的run函数*/
};/*定义导出log的类*/

void LogOutput::run(){/*定义成员函数*/
    qInstallMessageHandler(customMessageHandler);/*使用Qt自带的qInstallMessageHandler函数,导出log*/
}

void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    static QMutex mutex;/*线程锁,防止多个文件同时打log时,log部分缺失*/
    mutex.lock();
    QString txt;
    switch (type) {
    //调试信息提示
    case QtDebugMsg:
        txt = QString("Debug: %1").arg(msg);
        break;
        //一般的warning提示
    case QtWarningMsg:
        txt = QString("Warning: %1").arg(msg);
        break;
        //严重错误提示
    case QtCriticalMsg:
        txt = QString("Critical: %1").arg(msg);
        break;
        //致命错误提示
    case QtFatalMsg:
        txt = QString("Fatal: %1").arg(msg);
        abort();
    }
    txt = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz") + " " + txt;
    QString path=QCoreApplication::applicationDirPath()+"/debugs";/*保存log文件的路径*/
    QDir dir(path);
    if(!dir.exists()){
        dir.mkdir(path);
    }

    QFile outFile(path+"/debug.log");
    outFile.open(QIODevice::WriteOnly | QIODevice::Append);

    if(outFile.exists() && (outFile.size() >= 20*1024*1024)){
        QDateTime time = QDateTime::currentDateTime();        //获取系统当前时间
        QString str = time.toString("yyyy-MM-dd hh-mm-ss");

        outFile.close();
        QFile::rename(path+"/debug.log",path+"/log" + str + ".log");/*当前log输出文件debug.log重命名*/

        QFileInfoList fileList;
        fileList = dir.entryInfoList(QDir::Dirs|QDir::Files
                                       |QDir::Readable|QDir::Writable
                                       |QDir::Hidden|QDir::NoDotAndDotDot
                                       ,QDir::Name);
        int infoNum = fileList.size();/*当前文件夹的log数量*/
        if(infoNum > 512){
            QFile fileTemp(fileList.at(0).filePath());
            fileTemp.remove();
            fileList.removeAt(0);
        }//若数量达到一定值,则删除多余的log文件

    }else{
        QTextStream ts(&outFile); /*输出log到文件*/
        ts << txt << endl;
    }

    mutex.unlock();
}

  • main.cpp中的相关使用
    LogOutput logOutput;
    logOutput.start();/*开启log输出的线程,线程开启后,默认调用run函数*/

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值