很多开源代码日志框架都使用slf4j,slf4j(Simple Loging Facade For Java)直译过来就是简单java日志门面,它是Java提供的日志输出接口而非日志实现方案。故而slf4j需要搭配其他日志框架,如log4j、logback等来使用。
一、使用slf4j比直接使用其他日志实现方案来实现日志功能的好处
在实际框架搭建和代码编写过程中,我们会经常用到其他框架,而不同框架由不同的编码人员或者组织实现。日志框架也会各式各样。这时我们在引用其他框架后,代码中的日志框架就会五花八门,这样就会有很多问题出现。slf4j接口实现思想类似于JVM框架或着是JDBC(当然它比JVM、JDBC简单太多),它屏蔽掉日志具体实现细节,当我们引用其他基于slf4j实现的日志方案时,它就能很好的转换成我们现在使用的日志方案。这样我们开发时候就可以实现日志系统的灵活切换。
二、slf4j如何搭配其他日志方案使用(这里以springboot+slf4j+logback为例)
1、引入jar包
<properties>
<slf4j-api>1.7.25</slf4j-api>
<logback-core>1.2.3</logback-core>
<logback-access>1.1.3</logback-access>
<logback-classic>1.2.3</logback-classic>
</properties>
----------
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback-core}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback-access}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback-classic}</version>
</dependency>
2、logback配置和单独使用logback一样
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" debug="false">
<!-- 应用名称 -->
<property name="APP_NAME" value="kpatch_window" />
<!-- <property name="LOG_HOME" value="${log.dir:-logs}/${APP_NAME}" /> -->
<property name="LOG_HOME" value="C:/kpatchlogs/${APP_NAME}" />
<!-- 服务器端日志目录 -->
<!-- <property name="LOG_HOME" value="/home/donald/apache-tomcat-7.72.0/logs"></property> -->
<!-- 日志输出格式 -->
<property name="ENCODER_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n" />
<contextName>${APP_NAME}</contextName>
<!-- 控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger %L- %msg%n
</pattern>
</encoder>
</appender>
<!-- 系统错误日志:用于将错误日志输出到独立文件 -->
<appender name="SYSTEM_ERROR_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="NOT_CONTAIN_ERROR"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${LOG_HOME}/info.%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="NOT_CONTAIN_ERROR" />
</root>
<!-- 根日志 -->
<logger name="system">
<appender-ref ref="SYSTEM_ERROR_FILE" />
</logger>
</configuration>
3、使用logger,此时需要注意我们使用的Logger类和LoggerFactory类都是slf4j包中的
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value="/test")
public class TestController {
private static final Logger log = LoggerFactory.getLogger(TestController.class);
}