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

相关推荐
hqwest8 小时前
QT肝8天13--删除用户
开发语言·c++·qt·csdn开发云·列表分页·qt分页
hqwest9 小时前
QT肝8天08--主界面设计
开发语言·qt·上位机·qt开发·ui设计
金色熊族21 小时前
ubuntu20.04编译qt源码5.15.3
linux·c++·qt
看着捉急1 天前
x86_64 centos7.2 上用aarch64-linux-gnu-gcc4.8.5交叉编译qt5.11.3
linux·运维·qt
行者..................1 天前
petalinux 安装Openblass库
qt
掘根2 天前
【Qt】布局管理器
开发语言·qt
得鹿梦鱼、2 天前
QT示例 使用QTcpSocket和QTcpServer类实现TCP的自定义消息头、消息体通信示例
qt·qtcpsocket·qtcpserver·二进制协议通信·pimpl模式
茉莉玫瑰花茶2 天前
Qt 界面优化 --- 绘图
开发语言·数据库·qt
掘根2 天前
【Qt】容器类控件——QTabWidget
开发语言·qt