qDebug重定向(非常好用)

本文介绍了一个基于C++的日志管理系统实现,该系统能够自动循环记录多个日志文件,并支持不同类型的日志级别,包括Debug、Info、Warning、Critical和Fatal等。此外,文章还提供了如何安装和卸载日志处理器的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*FileLog.h*/

#ifndef FILELOG_H
#define FILELOG_H

#include <QObject>

class FileLog : public QObject
{
    Q_OBJECT
public:
    explicit FileLog(QObject *parent = nullptr);
    void installMessageHandler();
    void uninstallMessageHandler();
};

#endif // FILELOG_H





/*FileLog.cpp*/

#include "fileLog.h"
#include <QMutex>
#include <QDateTime>
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QTextStream>

const QStringList LogFiles = QStringList{
        "c:/log/message0",
        "c:/log/message1",
        "c:/log/message2",};
const int MaxSize = 1024 * 1024 * 10;
QString CurrentLogFile;
int CurrentIndex;

//接收调试信息的函数
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    static QMutex mutex;
    QMutexLocker lock(&mutex);

    QString msgType;
    switch(type)
    {
    //如果是debug信息,那么直接打印至应用程序输出,然后退出本函数
    case QtDebugMsg:
        msgType = QString("Debug");
        break;

    case QtInfoMsg:
        msgType = QString("Info");
        break;

    case QtWarningMsg:
        msgType = QString("Warning");
        break;

    case QtCriticalMsg:
        msgType = QString("Critical");
        break;

    case QtFatalMsg:
        msgType = QString("Fatal");
        break;

    default:
        msgType = QString("Default");
        break;
    }

    QString contextInfo = QString("%1 line[%2]")
            .arg(context.file)
            .arg(context.line);
    //消息打印时间
    QString strTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
    //调试信息
    QString message = QString("%1 %2 %3: %4\n")
            .arg(msgType)
            .arg(strTime)
            .arg(contextInfo)
            .arg(msg);

    //将调试信息写入文件
    QFile file(CurrentLogFile);
    file.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream text_stream(&file);
    text_stream << message;
    file.flush();
    file.close();

    //检查文件是否达到了指定大小
    QFileInfo info(CurrentLogFile);
    if(info.size() >= MaxSize)
    {
        CurrentLogFile = LogFiles.at(++CurrentIndex % LogFiles.count());
        QFile file(CurrentLogFile);
        file.open(QIODevice::WriteOnly | QIODevice::Truncate);
        file.close();
    }
}

//安装消息器
void FileLog::installMessageHandler()
{
    qInstallMessageHandler(outputMessage);
}
//卸载消息器
void FileLog::uninstallMessageHandler()
{
    qInstallMessageHandler(0);
}

FileLog::FileLog(QObject *parent) : QObject(parent)
{
    qint64 nMinSize = 0;
    for(int i=0;i<LogFiles.count();i++)
    {
        QFileInfo info(LogFiles.at(i));
        qint64 size = info.size();
        if(size == 0)
        {
            CurrentIndex = i;
            CurrentLogFile = LogFiles.at(i);
            break;
        }

        if(size < MaxSize && size > nMinSize)
        {
            nMinSize = size;
            CurrentIndex = i;
            CurrentLogFile = LogFiles.at(i);
            break;
        }
    }

    if(nMinSize == 0)
    {
        CurrentIndex = 0;
        CurrentLogFile = LogFiles.at(0);
        QFile file(CurrentLogFile);
        file.open(QIODevice::WriteOnly | QIODevice::Truncate);
        file.close();
    }

}

调用

FileLog* log= new FileLog;
log->installMessageHandler();

还有最最最重要的一项,在.pro文件添加

DEFINES += QT_MESSAGELOGCONTEXT

项目要清除重新编译,这样在Release模式下才能输出文件名和行号,以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JL_MG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值