当前位置: 首页 > news >正文

Qt中使用日志---Log4Qt

Qt中使用日志—Log4Qt

第一步:下载库文件

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

1.GitHub

2.SourceForge

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

ScreenShot_2025-10-03_102914_784

第二步:加载库文件

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

ScreenShot_2025-10-03_104447_438

第三步:写日志。

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

1.输出在控制台

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

#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.控制台绑定到 日志AppenderLog4Qt::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();
}

上述代码输出:

ScreenShot_2025-10-03_120201_049

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

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

2.输出在文件

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

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

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

ScreenShot_2025-10-03_121402_737

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

 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);

代码输出结果:

ScreenShot_2025-10-03_122335_935

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

QLogMgr.h

#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

#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.根据记录器绑定 AppenderLog4Qt::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); // 10MBrollingFileAppender->setMaxBackupIndex(5);rollingFileAppender->setAppendFile(true);rollingFileAppender->activateOptions();// 3. 错误日志文件 - 只记录 ERROR 和 FATALauto* 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);
}

代码测试:

#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();
}

代码运行输出结果:

ScreenShot_2025-10-03_141733_241

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

测试用例源代码:Gitee

http://www.dtcms.com/a/437981.html

相关文章:

  • linux centos 7 解决终端提示符出现-bash-4.2的问题
  • MCP模型上下文协议实战:个人应用项目如何集成MCP?
  • Vue--Vue基础(一)
  • 外贸网站推广如何做郑佩佩 最新消息
  • 用VScode和msys2配置C/C++和wxWidgets
  • 【升级安卓9教程】华为Q21_Q21A_Q21C_Q21AQ_Q21AE_hi3798mv200线刷烧录包带adb权限
  • vite vue 打包后运行,路由首页加载不出来
  • 《C++ STL:vector类(下)》:攻克 C++ Vector 的迭代器失效陷阱:从源码层面详解原理与解决方案
  • 微软Agent框架深度解析:重新定义AI应用开发的革命性架构
  • 微信看视频打赏网站建设项目立项流程图
  • 爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
  • [工作流节点8] 更新记录节点应用案例 —— 业务自动化的关键一环
  • MySQL表的内连和外连
  • go 基础
  • 鸿蒙开发3--UI布局(玩转鸿蒙的Row、Column与Stack容器)
  • 为什么要给企业建设网站做单位网站
  • ML4T - 第7章第8节 利用LR预测股票价格走势Predicting stock price moves with Logistic Regression
  • 性能之巅:大小水管问题深究
  • css选择器(继承补充)
  • 郑州高新区做网站的公司聚美优品的电子商务网站建设论文
  • uniapp集成语音识别与图片识别集成方案【百度智能云】
  • SpringCloud API Gateway2.0如何解决docker中应用间IP漂移的正确手法
  • 鸿蒙Next中使用mDNS发现局域网服务:完整指南与实战
  • 长泰建设局网站注册网站多久
  • 孝感网站开发江苏建设服务信息网站
  • 数据分析概述与环境搭建
  • 易语言网站怎么做帕绍网站建设
  • vue3父组件和子组件之间传递数据
  • Coze源码分析-资源库-编辑工作流-前端源码-核心流程/API/总结
  • Netty服务器监听读写超时