Qt实现输出日志到指定文件

开发平台 :

Qt Creator

语言:

C++

需求:

  1. 获取日志信息,写入指定文件
  2. 日志7天后过期
  3. 保护写入日志进程

前置操作:

1.在CMakeLists.txt中添加如下代码

cpp 复制代码
# 添加预处理,防止在release模式下,输出的日志信息不显示文件名,行号等信息
add_definitions(-DQT_MESSAGELOGCONTEXT)

2.创建LogManage.h 和 LogManage.cpp

具体代码:

LogManage.h

cpp 复制代码
#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

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

cpp 复制代码
int main(int argc, char *argv[])
{
//release模式下启动日志文件输出
#ifdef QT_NO_DEBUG
    InitalizeLog();
    //自定义日志输出
    qInstallMessageHandler(LogMessageHandler);
#endif
//other..
//other..
//other..
//other..
}
相关推荐
for_ever_love__2 分钟前
爬虫项目: 获取高分电影的数据总结
开发语言·python·学习
weixin_307779137 分钟前
C++代码实现MATLAB中的ode23t函数功能
开发语言·c++·算法·matlab
wuminyu18 分钟前
Markword在紧凑对象头上的实现原理剖析
java·linux·c语言·jvm·c++
君顾129 分钟前
24小时自助健身房系统开发实战与完整指南
java·开发语言·健身房
hansang_IR1 小时前
【代数与组合数学 | 那忘算 5】生成函数 & 例题 & 卷积
c++·算法·多项式·生成函数·母函数
无忧.芙桃1 小时前
数据结构之排序算法(上):从评价指标到插入、希尔、选择与堆排序
c语言·c++·排序算法
syagain_zsx1 小时前
算法基础篇 · 02 高精度(C++ 题解)
开发语言·c++·学习·高精度
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 242. 有效的字母异位词 | C++ 哈希计数与严密防线
c++·算法·leetcode
wabs6661 小时前
关于二叉树【力扣101.对称二叉树的思考】
数据结构·c++·算法·leetcode·二叉树
白远山1 小时前
无人自助健身平台搭建:从架构设计到设备联动的完整实战
java·开发语言·架构·需求分析