【QT】写日志文件

第一步:.h文件代码

#ifndef LOGMANAGE_H
#define LOGMANAGE_H
#include <QObject>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QDebug>
#include <QMutex>
#include "Ulitity_global.h"

class ULITITY_EXPORT LogManage: public QObject
{
    Q_OBJECT
public:
    /**
     * @brief 输出日志
     * @param message
     */
    static void log(QString message);
private:
    LogManage();
    ~LogManage();
    static bool openFile();
    static void closeFile();
private:
    static QFile file;
    static QMutex mutex;
    static int MAX_LOGFILE_SIZE;//最大文件 大小;
    static QString fileName;
};

#endif // LOGMANAGE_H

第二步:.cpp文件代码

#include "logmanage.h"

LogManage::LogManage()
{
}
LogManage::~LogManage()
{
    closeFile();
}

QFile LogManage::file;
QMutex LogManage::mutex;
int LogManage::MAX_LOGFILE_SIZE = 3 * 1024 * 1024;//最大文件 大小;
QString LogManage::fileName = "log.txt";

/**
 * @brief 打开文件
 * @return
 */
bool LogManage::openFile()
{
    try {
        if(file.isOpen()) {
            return true;
        }
        file.setFileName(fileName);
        if(file.size() > MAX_LOGFILE_SIZE) {
            QString current_date_time = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
            QString message = QString("%1%2%3").arg(current_date_time).arg("-").arg(fileName);
            file.rename(fileName, message);
        }
        file.open(QIODevice::WriteOnly | QIODevice::Append);
        if(!file.isOpen()) {
            qDebug() << "打开日志失败";
            return false;
        }
        return true;
    } catch (std::exception ex) {
        qCritical() << "打开文件失败:" << ex.what();
    }
    return false;
}

/**
 * @brief 输出日志
 * @param msg
 */
void LogManage::log(QString msg)
{
    try {
        mutex.lock();
        if(openFile()) {
            // 设置输出信息格式
            QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
            QString message = QString("[%1] %2").arg(current_date_time).arg(msg);
            // 输出信息至文件中(读写、追加形式)
            QTextStream text_stream(&file);
            text_stream << message << "\r\n";
            closeFile();
        } else {
            qDebug() << "打开日志失败";
        }
    } catch (std::exception ex) {
        closeFile();
        qCritical() << "输出日志失败:" << ex.what();
    }
    mutex.unlock();
}

/**
 * @brief 关闭日志
 */
void LogManage::closeFile()
{
    try {
        if(file.isOpen()) {
            file.flush();
            file.close();
        }
    } catch (std::exception ex) {
        qCritical() << "关闭日志失败:" << ex.what();
    }
}

第三步:其他类调用写日志

#include "logmanage.h"

LogManage::log("写日志测试");
posted @   qiutian-hao  阅读(190)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示