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自动对自己进行配置,这会导致记录输出到控制台。
自我配置
如果没有配置文件,直接创建一个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最佳实践的主要内容,如果未能解决你的问题,请参考以下文章