Qt中使用日志---Log4Qt
第一步:下载库文件
首先需要去官方网站下载LoganQt库。可以从两个地方去下载Log4Qt库。
1.GitHub
下载完成后,解压出来,然后把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