美文网首页
Logback 源码分析

Logback 源码分析

作者: ntjsz | 来源:发表于2018-01-15 21:22 被阅读0次

概述

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还未来得及将队列中的日志全部输出,则日志有可能会丢失。

相关文章

网友评论

      本文标题:Logback 源码分析

      本文链接:https://www.haomeiwen.com/subject/ljgdoxtx.html