目录:qt 关于日志添加知识

1.目录

qt 如何区分日志的级别

qt 的日志级别

qt 添加日志有多少种可选方案

qt 6.7 日志输出文件举例

Qt 日志输出的选择方案有多少

qt开发一个简单但的志系统

Log4Qt常用方法举例

log4qt 应用举例_log4qt 例子

qt log 输出为文件_qt日志输出到文件 

qt log 输出为文件,每分钟换一个log文件 

qt log 输出为文件,每分钟换一个log文件,将头文件和源文件分开

 qt log输出:分类;定时更新文件;带文件名、函数名、行号

 Log4Qt::Logger::rootLogger()

Log4Qt::Logger::rootLogger 

2.日志方案 

编号分类项目
1名称基本需求
需求输出日志到文件,按照线程和日志级别创建文件夹,日志每分钟保存一次,日志文件用时间命名
2名称基本需求+线程并行
需求输出日志到文件,按照线程和日志级别创建文件夹,日志每分钟保存一次,日志文件用时间命名,让不同线程的日志输出可以并行
3名称基本需求+线程并行+Qt内置
需求利用Qt内置的日志功能输出日志,但是将日志保存到文件,每分钟保存一次,并且要求,保存的文件按照线程和类型保存到不同的文件夹中;设计要求,每个线程有一个日志保存对象,在需要日志对象保存日志的时候,看对应线程的日志对象是否存在,如果存就获取对象,进行日志保存,如果不存在就创建对象并保存,然后在获取,线程锁只控制线程对象的获取和创建,不需要对日志的保存过程进行线程互斥锁定
4名称基本需求+线程并行+Qt内置+自动清理
需求利用Qt内置的日志功能输出日志,但是将日志保存到文件,每分钟保存一次,并且要求,保存的文件按照线程和类型保存到不同的文件夹中,且删除3天以上的日志文件;设计要求,每个线程有一个日志保存对象,在需要日志对象保存日志的时候,看对应线程的日志对象是否存在,如果存就获取对象,进行日志保存,如果不存在就创建对象并保存,然后在获取,线程锁只控制线程对象的获取和创建,不需要对日志的保存过程进行线程互斥锁定

3.关联知识

1.qt 日志

在Qt应用程序中,日志功能对于调试、追踪程序执行流程、定位问题原因等方面具有重要意义。Qt本身提供了一套日志系统,允许开发者将调试信息、警告、错误等日志消息输出到控制台或文件中。以下是关于Qt日志的详细介绍和使用方法:

一、Qt内置的日志功能

Qt提供了几个宏用于输出不同级别的日志信息:

  • qDebug():用于输出调试信息,通常包含详细的调试细节。
  • qInfo():用于输出一般性的信息,帮助开发者了解程序执行流程。
  • qWarning():用于输出警告信息,表示程序运行过程中出现了潜在的问题,但并没有阻止程序继续执行。
  • qCritical():用于输出严重错误信息,强调程序发生了严重的、可能会导致程序异常或严重影响程序功能的情况,但程序仍然能够运行并可能有机会尝试恢复。
  • qFatal():用于输出致命错误信息,表示发生了非常严重、无法恢复的错误,通常这类错误会导致程序立即终止。

默认情况下,这些宏的输出会显示在控制台(调试输出窗口)中。如果需要将这些信息保存到文件中,就需要对输出进行重定向。

二、将日志输出到文件

Qt提供了一个回调函数qInstallMessageHandler,允许开发者自定义日志消息的处理方式。通过实现一个自定义的消息处理函数,可以将日志信息输出到文件中。

实现步骤
  1. 定义自定义消息处理函数

    创建一个函数,用于处理Qt日志消息。该函数需要接收QtMsgType类型的日志级别、QMessageLogContext类型的上下文信息(包括文件名、函数名、行号等)以及日志消息字符串。

    void customMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
        static QMutex mutex;
        mutex.lock();
    
        QFile file("logfile.txt");
        if (!file.open(QIODevice::Append | QIODevice::Text)) {
            return;
        }
    
        QTextStream out(&file);
    
        QString text;
        switch (type) {
        case QtDebugMsg:
            text = QString("Debug: %1").arg(msg);
            break;
        case QtInfoMsg:
            text = QString("Info: %1").arg(msg);
            break;
        case QtWarningMsg:
            text = QString("Warning: %1").arg(msg);
            break;
        case QtCriticalMsg:
            text = QString("Critical: %1").arg(msg);
            break;
        case QtFatalMsg:
            text = QString("Fatal: %1").arg(msg);
            break;
        default:
            text = msg;
            break;
        }
    
        out << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz ") << text << endl;
        file.close();
    
        mutex.unlock();
    }
  2. 安装自定义消息处理器

    在程序的主函数中,使用qInstallMessageHandler函数将自定义的消息处理函数安装到Qt的日志系统中。

    int main(int argc, char *argv[]) {
        QApplication a(argc, argv);
    
        // 安装自定义消息处理器
        qInstallMessageHandler(customMessageOutput);
    
        // 示例日志输出
        qInfo() << "Application started";
        qDebug() << "Variable value";
        qWarning() << "Invalid input detected, using default value";
        qCritical() << "Critical failure in network connection";
        // qFatal("Unrecoverable system error occurred"); // 这会导致程序终止
    
        MainWindow w;
        w.show();
    
        return a.exec();
    }

三、高级日志功能

对于更复杂的日志需求,例如日志的轮转、分级别输出到不同的文件、远程日志等,可以考虑使用第三方的日志库。Qt社区中有一些开源的日志库,如QsLog、log4qt等,它们提供了丰富的功能,可以帮助开发者更轻松地管理日志。

使用第三方日志库(以QsLog为例)
  1. 下载并集成QsLog

    从QsLog的官方网站或GitHub仓库下载源代码,将其集成到Qt项目中。通常需要在项目的.pro文件中添加QsLog的包含路径和源文件。

    INCLUDEPATH += $$PWD/path/to/QsLog
    DEPENDPATH += $$PWD/path/to/QsLog
    SOURCES += $$PWD/path/to/QsLog/QsLog.cpp
    HEADERS += $$PWD/path/to/QsLog/QsLog.h
  2. 使用QsLog进行日志记录

    在代码中使用QsLog提供的API进行日志记录。QsLog支持多个日志级别,并允许将日志输出到文件、控制台或远程服务器。

    #include "QsLog.h"
    
    void MainWindow::on_logButton_clicked() {
        QsLogging::Logger& logger = QsLogging::Logger::instance();
    
        // 设置日志级别
        logger.setLoggingLevel(QsLogging::TraceLevel);
    
        // 添加文件输出目标
        QString logPath = QDir(QCoreApplication::applicationDirPath()).filePath("app.log");
        QsLogging::DestinationPtr fileDestination(QsLogging::DestinationFactory::MakeFileDestination(
            logPath,
            QsLogging::EnableLogRotation // 启用日志轮转
        ));
    
        logger.addDestination(fileDestination);
    
        // 记录日志
        LOG_INFO() << "Application started";
        LOG_DEBUG() << "Variable value";
        LOG_WARNING() << "Invalid input detected, using default value";
        LOG_CRITICAL() << "Critical failure in network connection";
        // LOG_FATAL() << "Unrecoverable system error occurred"; // 这会导致程序终止
    }

四、注意事项

  • 性能考虑:频繁的日志写入操作可能会影响程序的性能,特别是在循环或高频事件中。可以考虑使用线程或线程池来处理日志写入,或者使用缓冲区积累一定量的日志后再批量写入文件。
  • 日志级别:合理设置日志级别,避免在生产环境中输出过多的调试信息。
  • 日志格式:设计清晰的日志格式,便于后续的分析和排查问题。
  • 安全性:在记录敏感信息时,要注意保护隐私和数据安全,避免将敏感信息泄露到日志文件中。

通过以上介绍,相信您对Qt日志功能有了更深入的了解。在实际开发中,可以根据项目的具体需求选择合适的日志实现方式,以提高开发效率和程序的可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值