概述
logback 1.2.3
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
包含3个模块:
- Maven: org.sl4j: sl4j-api: 1.7.25
sl4j-api-1.7.25.jar - Maven: ch.qos.logback: logback-core: 1.2.3
logback-core-1.2.3.jar - Maven: ch.qos.logback: logback-classic: 1.2.3
logback-classic-1.2.3.jar
Xml配置文件 Demo
xml配置文件不提供xsd或dtd等schema文件,原因如官网所述
As will be demonstrated over and over, the syntax of logback configuration files is extremely flexible. As such, it is not possible to specify the allowed syntax with a DTD file or an XML schema.
Demo
logback.xml
<configuration>
<property name="ROOT_DIR" value="log/" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${ROOT_DIR}/demo.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${ROOT_DIR}/demo-%d{yyyy-MM-dd}#%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>%-40(%date{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) [%thread]) \(%class:%line\) %-6([%logger]) %msg%n</pattern>
</encoder>
</appender>
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
<includeCallerData>true</includeCallerData>
</appender>
<root level="info">
<appender-ref ref="ASYNC" />
</root>
</configuration>
rollingPolicy dictate RollingFileAppender's behavior when rollover occurs.
triggeringPolicy tell RollingFileAppender when to activate the rollover procedure.
如果includeCallerData不设为true,AsyncAppender将无法输出class name和line number,但单纯的同步的RollingFileAppender不受影响。
demo.log为当天日志,历史日志以fileNamePattern中的格式命名。
源码分析
配置文件及Logger初始化
一般需要同时设置rollingPolicy和triggeringPolicy,但SizeAndTimeBasedRollingPolicy类也实现了TriggeringPolicy接口,所以无需再额外设置triggeringPolicy。
encoder中pattern的格式书写在官网的Ch 6: Layouts中
% 和 ) 均为token,需要转义再使用
pattern字符串的解析及Converter的构建工作由PatternLayoutEncoder和PatternLayout等类完成。
Token类包含了对pattern进行词法分析行的token,如"LITERAL" "SIMPLE_KEYWORD" "%" "RIGHT_PARENTHESIS"等
PatternLayout类包含了pattern中的关键字,如"date" "thread"等
LoggerFactory.getLogger()时序图
Logger类图
Logger.info()时序图
AsyncAppender内部的日志队列是由ArrayBlockingQueue实现的。
如果程序正常退出或是JVM崩溃等,AsyncAppender还未来得及将队列中的日志全部输出,则日志有可能会丢失。
题外话
虚拟机参数默认 OmitStackTraceInFastThrow=true,即-XX:+OmitStackTraceInFastThrow
效果是频繁抛出的同一异常,不再打印调用栈。此效果只对NullPointerException, ClassCastException 等几个java内置异常有效。