日志门面与日志框架
slf4j是典型的“日志门面(Logging Facade)”,利用了设计模式中的门面模式思想,对外提供一套通用的日志记录的API,而不提供具体的日志输出服务,要实现日志输出,需要集成其他的日志框架,例如log4j2,logback,log4j,jul等。
这种门面模式的好处在于,记录日志的API和日志输出的服务分离开,代码里面只需要关注记录日志的API,通过slf4j指定的接口记录日志;而日志输出通过引入jar包的方式即可指定其他的日志框架。当我们需要改变系统的日志输出服务时,不用修改代码,只需要改变引入日志输出框架jar包。
slf4j集成原理.png-19.5kB
- 目前提供日志门面的框架包括:slf4j, common-logging
- 完整的日志框架包括:log4j2, logback, log4j, java.util.logging
(完整日志框架是指框架本身包括记录日志的API和日志输出的服务)
需要指出一点,门面模式提供了一种日志API和输出分离的模式,但是除slf4j和common logging之外的其他完整的日志框架,本身就具备同时提供日志API和输出的服务,当然也是可以直接采用这些框架本身记录日志的。
其中Logger可以被分配级别,常用的级别包括:TRACE<DEBUG<INFO<WARN<ERROR。
附一个SpringBoot项目开发中常用的logback.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<conversionRule conversionWord="clr"
converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
<!-- 临界值过滤器,过滤掉低于指定临界值的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
</appender>
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/Logback.log</file>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
<!-- 临界值过滤器,过滤掉低于指定临界值的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/%d{yyyy-MM-dd}/Logback.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!--logger节点,可选节点,用来具体指明包的日志输出级别,它将会覆盖root的输出级别-->
<logger name="com.yj" level="debug" />
<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
</configuration>