Logback 源码分析

概述

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不设为trueAsyncAppender将无法输出class name和line number,但单纯的同步的RollingFileAppender不受影响。

demo.log为当天日志,历史日志以fileNamePattern中的格式命名。

源码分析

配置文件及Logger初始化

一般需要同时设置rollingPolicytriggeringPolicy,但SizeAndTimeBasedRollingPolicy类也实现了TriggeringPolicy接口,所以无需再额外设置triggeringPolicy

encoderpattern的格式书写在官网的Ch 6: Layouts
% 和 ) 均为token,需要转义再使用
pattern字符串的解析及Converter的构建工作由PatternLayoutEncoderPatternLayout等类完成。
Token类包含了对pattern进行词法分析行的token,如"LITERAL" "SIMPLE_KEYWORD" "%" "RIGHT_PARENTHESIS"等
PatternLayout类包含了pattern中的关键字,如"date" "thread"等

LoggerFactory.getLogger()时序图

SequenceDiagram LoggerFactory.getLogger()

Logger类图

ClassDiagram Logger

Logger.info()时序图

SequenceDiagram Logger.info()

AsyncAppender内部的日志队列是由ArrayBlockingQueue实现的。
如果程序正常退出或是JVM崩溃等,AsyncAppender还未来得及将队列中的日志全部输出,则日志有可能会丢失。

题外话

虚拟机参数默认 OmitStackTraceInFastThrow=true,即-XX:+OmitStackTraceInFastThrow
效果是频繁抛出的同一异常,不再打印调用栈。此效果只对NullPointerException, ClassCastException 等几个java内置异常有效。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容