Logback最佳实践

Posted 京东虚拟平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Logback最佳实践相关的知识,希望对你有一定的参考价值。

介绍

    Logback是目前应用最广的日志系统之一,可以根据不同的日志级别(DEBUG、INFO、WARN、ERROR)打印日志。Logback是一种日志通道,负责将日志收集起来,并且根据用户的配置将日志输出到不同的位置,如文件、SocketServer、指定的邮箱、数据库等。

Logback体系结构

     Logback的基本结构充分通用,可应用于各种不同环境。目前,logback分为三个模块:Core、Classic和Access。

    Core模块是其他两个模块的基础。Classic模块扩展了core模块。Classic模块相当于log4j的显著改进版。Logback-classic直接实现了SLF4J API,因此你可以在logback与其他记录系统如log4j和java.util.logging (JUL)之间轻松互相切换。Access模块与Servlet容器集成,提供HTTP访问记录功能。

Logback建立于三个主要类之上:Logger、Appender和Layout。

Logback请求时序图:


配置

    Logback可以通过xml配置,也可以通过创建Java对象进行配置。

Logback采取下面的步骤进行自我配置:

1. 尝试在classpath下查找文件logback-test.xml;

2. 如果文件不存在,则查找文件logback.xml;

3. 如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台。

    

Logback最佳实践

自我配置

 如果没有配置文件,直接创建一个Logger对象

Logger logger = LoggerFactory.getLogger("Application");

这样会自动创建一个最小配置的Logger。最小化配置由一个关联到根logger的ConsoleAppender组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n的PatternLayoutEncoder进行格式化。还有,根logger默认级别是DEBUG。


配置系统Joran

Logback-core附带了Joran,Joran是个强大的、通用的配置系统。Logback的默认配置机制是调用JoranConfigurator对classpath上的默认配置文件进行处理。

Logger logger = LoggerFactory.getLogger(MyApp3.class);

LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();

try {

    JoranConfigurator configurator = new JoranConfigurator();

    configurator.setContext(context);

    context.reset();

    configurator.doConfigure("D://logback.xml");

} catch (JoranException je) {

    // StatusPrinter will handle this

}

logger.info("Hello JDXN");

通过JoranConfigurator配置,可以将logback.xml里面的Logger替换之前声明的MyApp3.class的Logger。


Appender

    Appender是负责写记录事件的组件。Appender必须实现接口“ch.qos.logback.core.Appender”。Appender接口里的多数方法都是getter和setting。值得注意的是doAppend()方法,它唯一的参数是类型E的对象。类型E的实际类型视logback模块的不同而不同。在logback-classic模块里,E可能是“ILoggingEvent”类型;在logback-access模块里,E可能是“AccessEvent”类型。doAppend()方法也许是logback框架里最重要的方法,它负责以适当的格式将记录事件输出到合适的设备。

OutputStreamAppender把事件添加到java.io.OutputStream。该类提供其他appender所需的基本服务。

ConsoleAppender把事件添加到控制台,更准确地说是System.out或System.err,默认为前者。ConsoleAppender按照用户指定的encoder对事件进行格式化。

FileAppender是OutputStreamAppender的子类,把记录事件添加到文件。

RollingFileAppender继承FileAppender,能够滚动记录文件,如果按照某个时间段切割记录日志,一般使用这个Appender。

SocketAppender被设计为通过序列化ILoggingEvent实例把记录输出到远程实体。

JMSAppenderBase类与SocketAppender完成相同概念的任务,只是基于JMS API而不是TCP套接字。JMS即Java消息系统API为面向消息的中间件(MOM)产品提供抽象层。

SMTPAppender在固定大小的缓冲里积累记录时间,当用户指定的事件发生后,就通过email发出这些事件。

DBAppender把记录事件写入数据库的三张表。三张表分别是logging_event、logging_event_property和logging_event_exception。


过滤器Filter

    Logback的过滤器基于三值逻辑(ternary logic),允许把它们组装或成链,从而组成任意的复合过滤策略。过滤器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一个。如果返回DENY,那么记录事件立即被抛弃,不再经过剩余过滤器。如果返回NEUTRAL,那么有序列表里的下一个过滤器会接着处理记录事件。如果返回ACCEPT,那么记录事件被立即处理,不再经过剩余过滤器。


映射诊断环境MDC

    一个轻量的技术是为客户端的每个记录请求添加唯一戳(uniquely stamp)。Logback在SLJ4J里使用了这种技术的一种变体:映射诊断环境(MDC)。为了给每个请求添加唯一戳,用户把环境(context)信息放进MDC,然后在配置文件的encoder中把对应的name打印出来。


最佳实践

第一个Logback程序

public class HelloWorld {

public static void main(String[] args) {

    Logger logger = LoggerFactory.getLogger("HelloWorld");

    logger.debug("同学们,大家好!");

  }

}


XML配置

<appender name="hotel_service_error" class="ch.qos.logback.core.rolling.RollingFileAppender">

    <filter class="ch.qos.logback.classic.filter.LevelFilter">

        <level>ERROR</level>

        <onMatch>ACCEPT</onMatch>

        <onMismatch>DENY</onMismatch>

    </filter>

    <file>${log_dir}/hotel_service_error.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

        <fileNamePattern>${log_dir}/hotel_service_error.%d.log</fileNamePattern>

        <maxHistory>${maxHistory}</maxHistory>

    </rollingPolicy>

    <encoder>

        <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{30} - %mdc - %msg%n</pattern>

        <charset>UTF-8</charset>

    </encoder>

</appender>

该配置使用的Appender为RollingFileAppender,支持文件滚动记录,滚动的策略是在rollingPolicy中配置,当前配置标识按天生成日志文件。

大家注意到filter的配置,它标识按照日志级别level进行过滤。onMatch和onMismatch表示如果是ERROR则继续记录日志,否则放过该条日志的记录。

<file>节点配置的日志文件存放的位置。

<maxHistory>表示日志存放的文件数。

<encoder>表示日志打印的格式,其中%mdc是将放在映射诊断环境(MDC)中的值打印出来。


以上是关于Logback最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot之logback日志最佳实践

在 SLF4J/Logback 中使用标记的最佳实践

腾讯云Log4j/Logback日志采集最佳实践

Java日志体系最佳实践

云原生架构-最佳实践-日志规约

Log4j2与Slf4j的最佳实践