Log4Qt 日志格式化(SimpleLayout)

高效程序员

共 4155字,需浏览 9分钟

 ·

2021-09-07 19:19

星标/置顶 公众号👇硬核文章第一时间送达


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(例如:PatternLayoutSimpleLayoutTTCCLayout)都是通过这个函数来确定具体要输出哪些信息的。


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!

可以看出,使用配置文件和纯代码的效果是一样的。



往期推荐




☞ 专辑 | 趣味设计模式
☞ 专辑 | 音视频开发
☞ 专辑 | C++ 进阶
☞ 专辑 | 超硬核 Qt
☞ 专辑 | 玩转 Linux
☞ 专辑 | GitHub 开源推荐
☞ 专辑 | 程序人生


关注公众「高效程序员」👇一起优秀!

回复 “入群” 进技术交流群,回复 “1024” 获取海量学习资源。
浏览 26
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报