Qt中使用日志---Log4Qt

Qt中使用日志---Log4Qt

第一步:下载库文件

首先需要去官方网站下载LoganQt库。可以从两个地方去下载Log4Qt库。

1.GitHub

2.SourceForge

下载完成后,解压出来,然后把Src文件夹复制到自己的项目中。如下图:

第二步:加载库文件

在项目的.pro文件中添加Log4Qt项目,这样Log4Qt项目就作为我们项目的子项目了。如下图:

第三步:写日志。

由于我目前使用的是Qt 6.7.0版本,其中Log4Qt库中很多类的使用已经在Qt 6.7.0中都没有了,因此需要不断的调试运行,修改Log4Qt库的源代码。这里我已经修改完了。

1.输出在控制台

下面是一个在控制台输出的简单的例子:

C++ 复制代码
#include"log4qt/logger.h"
#include"log4qt/consoleappender.h"
#include"log4qt/patternlayout.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // 1.创建布局
    auto* pLayout = new Log4Qt::PatternLayout();
    pLayout->setConversionPattern("%d{yyyy-MM-dd HH:mm:ss.zzz} [%-5p] %m%n");
    pLayout->activateOptions();

    // 2.创建输出方式为控制台
    auto* pAppender = new Log4Qt::ConsoleAppender(pLayout,Log4Qt::ConsoleAppender::STDOUT_TARGET);
    pAppender->activateOptions();

    // 3.控制台绑定到 日志Appender
    Log4Qt::Logger::rootLogger()->addAppender(pFileAppender);
    Log4Qt::Logger::rootLogger()->setLevel(Log4Qt::Level::DEBUG_INT);

    // 4.使用
    Log4Qt::Logger::rootLogger()->info("Hello");
    Log4Qt::Logger::rootLogger()->warn("Warning");
    Log4Qt::Logger::rootLogger()->debug("Debug");
    Log4Qt::Logger::rootLogger()->error("Erroring");
   
    return a.exec();
}

上述代码输出:

代码说明:其中setConversionPattern函数的参数是设置输出什么样形式的日志信息,上面我只输出了时间、类型、信息3种。这个地方可以设置更加高级的输出格式,比如:

C++ 复制代码
 auto* detailedLayout = new Log4Qt::PatternLayout();
 detailedLayout->setConversionPattern("%d{ISO8601} [%-5p] [%t] %c{2} %F:%L - %m%n");
 detailedLayout->activateOptions();

2.输出在文件

接下来在文件中输出:只需要修改输出方式为文件即可.

C++ 复制代码
 // 创建文件输出
// 获取程序运行目录
 QString exeDir = QCoreApplication::applicationDirPath();
// 拼接同目录下的配置文件
 QString strFilePath = QDir(exeDir).filePath("application.log");
 auto* pFileAppender = new Log4Qt::FileAppender(pLayout,strFilePath,true);

代码运行结果:在程序运行目录下可以看到生成了一个application.log文件,里面输出内容:

由于info函数的重载,可以输出带参数的日志。

C++ 复制代码
 Log4Qt::Logger* rootLogger = Log4Qt::Logger::rootLogger();
 int userId = 12345;
 QString userName = "John Doe";
 double processingTime = 2.345;
 rootLogger->info("User processed: ID=%1, Name=%2, Time=%3ms",
                     userId, userName, processingTime);

代码输出结果:

下面是一个多线程日志输出的例子:

QLogMgr.h

c++ 复制代码
#ifndef QLOGMGR_H
#define QLOGMGR_H
#include"log4qt/logger.h"
#include"log4qt/consoleappender.h"
#include"log4qt/patternlayout.h"
#include"log4qt/propertyconfigurator.h"
#include"log4qt/logmanager.h"
#include"log4qt/fileappender.h"
#include"log4qt/rollingfileappender.h"
#include"log4qt/varia/levelrangefilter.h"
#include<QThread>

class WorkerThread : public QThread
{
private:
    void run() override
    {
        Log4Qt::Logger* logger = Log4Qt::Logger::logger("WorkerThread");
        for (int i = 0; i < 5; ++i)
        {
            QString strInfo = QString::asprintf("Thread %p processing task %d",QThread::currentThreadId(),i);
            logger->info(strInfo);

            QThread::msleep(100); // 模拟工作

            QString str1 = QString::asprintf("Thread %p processing Task %d completed",QThread::currentThreadId(),i);
            logger->info(str1);
        }

        QString str = QString::asprintf("Worker thread %p finished",QThread::currentThreadId());
        logger->info(str);
    }
};

class QLogMgr
{
public:
    QLogMgr();
    ~QLogMgr();
    // 配置日志
    void setUpDetailLogging();

    void demoLogging();
    // 多线程日志
    void demoMultiThreadLogging();
    // 高级日志
    void setupAdvancedLogging();
};

QLogMgr.cpp

C++ 复制代码
#include "qlogmgr.h"

QLogMgr::QLogMgr()
{

}

QLogMgr::~QLogMgr()
{

}

void QLogMgr::setUpDetailLogging()
{
    // 1. 创建详细的布局模式
    auto* pLayout = new Log4Qt::PatternLayout();
    pLayout->setConversionPattern("%d{yyyy-MM-dd HH:mm:ss.zzz} [%-5p] %m%n");
    pLayout->activateOptions();

    // 2.创建文件输出
    QString exeDir = QCoreApplication::applicationDirPath();
    QString strFilePath = QDir(exeDir).filePath("application.log");
    auto* pFileAppender = new Log4Qt::FileAppender(pLayout,strFilePath,true);
    pFileAppender->activateOptions();

    // 3.根据记录器绑定 Appender
    Log4Qt::Logger::rootLogger()->addAppender(pFileAppender);
    Log4Qt::Logger::rootLogger()->setLevel(Log4Qt::Level::INFO_INT);

}


void QLogMgr::demoLogging()
{
    // 获取不同类别的记录器
    Log4Qt::Logger* rootLogger = Log4Qt::Logger::rootLogger();
    Log4Qt::Logger* networkLogger = Log4Qt::Logger::logger("Network");
    Log4Qt::Logger* databaseLogger = Log4Qt::Logger::logger("Database");
    Log4Qt::Logger* businessLogger = Log4Qt::Logger::logger("Business");

    // 输出不同级别的日志
    rootLogger->debug("Application started");
    rootLogger->info("Initialization completed");

    // 网络相关日志
    networkLogger->debug("Connecting to server: 192.168.1.100:8080");
    networkLogger->info("HTTP GET request sent to /api/data");
    networkLogger->warn("Network latency detected: 150ms");
    networkLogger->error("Connection timeout after 30 seconds");

    // 数据库相关日志
    databaseLogger->debug("Executing SQL: SELECT * FROM users WHERE id = ?");
    databaseLogger->info("Database connection established successfully");
    databaseLogger->error("SQL execution failed: Table 'users' doesn't exist");

    // 业务逻辑日志
    businessLogger->trace("Entering user authentication process");
    businessLogger->debug("User credentials validated");
    businessLogger->info("User login successful: john_doe");
    businessLogger->fatal("Critical business rule violation detected");

    // 带参数的日志
    int userId = 12345;
    QString userName = "John Doe";
    double processingTime = 2.345;

    rootLogger->info("User processed: ID=%1, Name=%2, Time=%3ms",
                     userId, userName, processingTime);

    // 异常日志
    try {
        throw std::runtime_error("Simulated exception for logging");
    } catch (const std::exception& e) {
        rootLogger->error("Exception caught: %1", QString::fromLocal8Bit(e.what()));
    }
}


void QLogMgr::demoMultiThreadLogging()
{
    Log4Qt::Logger* mainLogger = Log4Qt::Logger::logger("Main");
    mainLogger->info("Starting multi-thread logging demo");

    WorkerThread threads[3];

    for (int i = 0; i < 3; ++i)
    {
        threads[i].start();
    }

    for (int i = 0; i < 3; ++i)
    {
        threads[i].wait();
    }

    mainLogger->info("All worker threads completed");
}


void QLogMgr::setupAdvancedLogging()
{
    // 1. 创建不同详细程度的布局
    auto* detailedLayout = new Log4Qt::PatternLayout();
    detailedLayout->setConversionPattern("%d{ISO8601} [%-5p] [%t] %c{2} %F:%L - %m%n");
    detailedLayout->activateOptions();

    auto* simpleLayout = new Log4Qt::PatternLayout();
    simpleLayout->setConversionPattern("[%-5p] %m%n");
    simpleLayout->activateOptions();

    // 2. 滚动文件输出 - 按大小和日期滚动
    auto* rollingFileAppender = new Log4Qt::RollingFileAppender();
    rollingFileAppender->setLayout(detailedLayout);
    rollingFileAppender->setFile("logs/app.log");
    QString str = QString("%1").arg(10 * 1024 * 1024);
    rollingFileAppender->setMaxFileSize(str); // 10MB
    rollingFileAppender->setMaxBackupIndex(5);
    rollingFileAppender->setAppendFile(true);
    rollingFileAppender->activateOptions();

    // 3. 错误日志文件 - 只记录 ERROR 和 FATAL
    auto* errorFileAppender = new Log4Qt::FileAppender(detailedLayout, "logs/error.log", true);

    // 添加级别过滤器
    auto* errorFilter = new Log4Qt::LevelRangeFilter();
    errorFilter->setAcceptOnMatch(true);
    errorFilter->setLevelMin(Log4Qt::Level::ERROR_INT);
    errorFileAppender->addFilter(errorFilter);
    errorFileAppender->activateOptions();

    // 4. 控制台输出 - 简化格式
    auto* consoleAppender = new Log4Qt::ConsoleAppender(simpleLayout);
    consoleAppender->activateOptions();


    // 设置特定记录器的级别
    Log4Qt::Logger::logger("Network")->setLevel(Log4Qt::Level::INFO_INT);
    Log4Qt::Logger::logger("Database")->setLevel(Log4Qt::Level::WARN_INT);
}

代码测试:

c++ 复制代码
#include <QCoreApplication>
#include"qlogmgr.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // Set up code that uses the Qt event loop here.
    // Call a.quit() or a.exit() to quit the application.
    // A not very useful example would be including
    // #include <QTimer>
    // near the top of the file and calling
    // QTimer::singleShot(5000, &a, &QCoreApplication::quit);
    // which quits the application after 5 seconds.

    // If you do not need a running Qt event loop, remove the call
    // to a.exec() or use the Non-Qt Plain C++ Application template.

 
    QLogMgr log;
    // 设置详细的日志配置
    log.setUpDetailLogging();
    // 演示多线程日志
    log.demoMultiThreadLogging();

    return a.exec();
}

代码运行输出结果:

关于Log4Qt的简单介绍就到这里了,关于Log4Qt库的更多使用示例,后面需要使用时,在慢慢的探索。

测试用例源代码:Gitee

相关推荐
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner5 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz10 天前
QML Hello World 入门示例
qt
xcyxiner13 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner14 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner14 天前
DicomViewer (添加模型类)3
qt
xcyxiner15 天前
DicomViewer (目录调整) 2
qt
xcyxiner15 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能17 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G17 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt