浅析java日志框架slf4j

很多开源代码日志框架都使用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);


}

猜你喜欢

转载自blog.csdn.net/u012343297/article/details/79898123