Log4Qt 日志格式化(SimpleLayout)
星标/置顶 公众号👇,硬核文章第一时间送达!
1
关于 format()
和其它布局一样,SimpleLayout
也派生自 Layout。正如其名所示,SimpleLayout
特别的简单,因为它只包含了日志的级别和消息内容。
根据源码,可以很快了解这一点:
QString SimpleLayout::format(const LoggingEvent &event)
{
if (mShowLevel)
return event.level().toString() + QStringLiteral(" - ") + event.message() + Layout::endOfLine();
return event.message() + Layout::endOfLine();
}
这里最关键的是 format()
,它是 Layout
中的一个纯虚函数,用于格式化消息的输出。也就是说,所有的 Layout
(例如:PatternLayout
、SimpleLayout
、TTCCLayout
)都是通过这个函数来确定具体要输出哪些信息的。
而 LoggingEvent
派生自 QEvent
,它是一个日志相关的事件,包含了日志的一切必要信息,例如:日志级别、日志内容、线程名等。
在实际场景中,一般很少会用到 SimpleLayout
,因为它包含的信息特别少。之所以讲解它,主要是为了让大家快速理解各个 Layout
的实现方式,以及如何自定义 Layout
。
2
SimpleLayout
创建一个 SimpleLayout
,并将日志信息输出至控制台中:
#include <QCoreApplication>
#include <log4qt/logger.h>
#include <log4qt/simplelayout.h>
#include <log4qt/consoleappender.h>
#include <log4qt/loggerrepository.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个 SimpleLayout(输出日志的级别和消息内容)
Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger();
Log4Qt::SimpleLayout *layout = new Log4Qt::SimpleLayout();
layout->setName("My Layout");
// layout->setShowLevel(false);
layout->activateOptions();
// 创建一个 ConsoleAppender(将日志内容输出到控制台上)
Log4Qt::ConsoleAppender *appender = new Log4Qt::ConsoleAppender(layout, Log4Qt::ConsoleAppender::STDOUT_TARGET);
appender->setName("My Appender");
appender->activateOptions();
logger->addAppender(appender);
logger->setLevel(Log4Qt::Level::DEBUG_INT);
logger->debug("Hello, Log4Qt!");
// 关闭 logger
logger->removeAllAppenders();
logger->loggerRepository()->shutdown();
return a.exec();
}
运行程序,输出如下:
DEBUG - Hello, Log4Qt!
可以看到,输出信息只包含了日志的级别和消息内容,并没有线程、Logger、日期时间等内容。
如果不想输出日志级别,可以打开代码中的注释部分:
layout->setShowLevel(false);
再次运行程序,输出如下:
Hello, Log4Qt!
可以看到,输出信息中只包含了消息内容,并没有日志级别。
3
使用配置文件
编写一个配置文件 - log4qt.properties
,执行与上例中使用相同的任务:
# 定义 rootLogger
log4j.rootLogger=DEBUG, console
# 定义 ConsoleAppender
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.immediateFlush=true
log4j.appender.console.target=STDOUT_TARGET
# 为 ConsoleAppender 定义 Layout
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
#log4j.appender.console.layout.showLevel=false
如果要输出日志级别,可以注释掉 showLevel 所在行,或者将值改为 true。
然后,使用下面的程序:
#include <QCoreApplication>
#include <log4qt/logger.h>
#include <log4qt/loggerrepository.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 获取 rootLogger
Log4Qt::Logger* logger = Log4Qt::Logger::rootLogger();
// 打印消息
logger->debug("Hello, Log4Qt!");
// 关闭 rootLogger
logger->removeAllAppenders();
logger->loggerRepository()->shutdown();
return a.exec();
}
运行程序,输出如下:
DEBUG - Hello, Log4Qt!
可以看出,使用配置文件和纯代码的效果是一样的。
关注公众号「高效程序员」👇,一起优秀!