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.输出在控制台
下面是一个在控制台输出的简单的例子:
#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();
}
上述代码输出:
代码说明:其中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文件,里面输出内容:
由于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);
代码输出结果:
下面是一个多线程日志输出的例子:
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();
}
代码运行输出结果:
关于Log4Qt的简单介绍就到这里了,关于Log4Qt库的更多使用示例,后面需要使用时,在慢慢的探索。
测试用例源代码:Gitee