天天看點

13.內建日志元件Logback

1.Logback簡介

Logback是由log4j創始人設計的另一款開源日志元件,主要包括以下幾個子產品。

logback-core:logback-classic和logback-access的基礎子產品。

logback-classic:log4j的改良版本,完整實作了slf4j的API,可以友善地進行日志系統更換,如log4j。

logback-access:與Servlet容器內建的通路子產品,提供通過HTTP來通路日志的功能。

2.引入依賴

建立一個SpringBoot工程,并在pom.xml檔案中添加內建Logback所需要的dependency。

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-core</artifactId>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-access</artifactId>
</dependency>      

3.在resources目錄下建立logback.xml檔案,檔案内容如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--輸出檔案位置-->
        <File>/Users/steven/Documents/代碼/springBoot/logs/debug.log</File>
        <!--編碼-->
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS}][%p][%c{200}][%t] %m%n</pattern>
            <immediateFlush>true</immediateFlush>
        </encoder>
        <!--日志級别-->
        <filter class = "ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!--滾動輸出政策,歸檔檔案名字-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/Users/steven/Documents/代碼/springBoot/logs/debug.log.%d{yyyy-MM-dd}</fileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>/Users/steven/Documents/代碼/springBoot/logs/info.log</File>
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS}][%p][%c{200}][%t] %m%n</pattern>
            <immediateFlush>true</immediateFlush>
        </encoder>

        <filter class = "ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/Users/steven/Documents/代碼/springBoot/logs/info.log.%d{yyyy-MM-dd}</fileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>/Users/steven/Documents/代碼/springBoot/logs/warn.log</File>
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS}][%p][%c{200}][%t] %m%n</pattern>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>warn</level>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/Users/steven/Documents/代碼/springBoot/logs/warn.log.%d{yyyy-MM-dd}</fileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>/Users/steven/Documents/代碼/springBoot/logs/error.log</File>
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS}][%p][%c{200}][%t] %m%n</pattern>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>error</level>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/Users/steven/Documents/代碼/springBoot/logs/error.log.%d{yyyy-MM-dd}</fileNamePattern>
        </rollingPolicy>
    </appender>

    <!--全局日志級别-->
    <!--設定某個包或者類使用哪個appender-->
    <logger name="com.leichuangkj.logback" additivity="false">
        <appender-ref ref="debug" />
        <appender-ref ref="info"/>
        <appender-ref ref="warn"/>
        <appender-ref ref="error"/>
    </logger>
    <root level="debug"></root>
</configuration>      

4.添加配置

在application.properties檔案中添加如下配置資訊。

############################################################
#
# Logback配置
#
############################################################
logging.config=classpath:logback.xml      

5.測試用例

在單元測試類LogbackApplicationTests中添加如下代碼。

@SpringBootTest
class LogbackApplicationTests {
  private static final org.slf4j.Logger log = LoggerFactory.getLogger(LogbackApplicationTests.class);

  @Test
  void contextLoads() {
    log.debug("log level:debug");
    log.info("log level:info");
    log.warn("log level:warn");
    log.error("log level:error");
  }
}      

右鍵執行LogbackApplicationTests單元測試,這時可以看到控制台顯示“1 test passed”以及如下列印資訊。

13.內建日志元件Logback

在日志目錄“/Users/steven/Documents/代碼/springBoot/logs”下可以看到生成如下圖所示的4個.log檔案。

13.內建日志元件Logback

各檔案内容如下所示。

//debug
[00:05:23.701][DEBUG][com.leichuangkj.logback.LogbackApplicationTests][main] Running with Spring Boot v2.3.1.RELEASE, Spring v5.2.7.RELEASE
[00:05:27.347][DEBUG][com.leichuangkj.logback.LogbackApplicationTests][main] log level:debug

//info
[00:05:23.697][INFO][com.leichuangkj.logback.LogbackApplicationTests][main] Starting LogbackApplicationTests on 192.168.0.106 with PID 8864 (started by steven in /Users/steven/Documents/代碼/springBoot/logback)
[00:05:23.701][INFO][com.leichuangkj.logback.LogbackApplicationTests][main] No active profile set, falling back to default profiles: default
[00:05:26.975][INFO][com.leichuangkj.logback.LogbackApplicationTests][main] Started LogbackApplicationTests in 4.135 seconds (JVM running for 7.461)
[00:05:27.347][INFO][com.leichuangkj.logback.LogbackApplicationTests][main] log level:info

//warn
[00:05:27.347][WARN][com.leichuangkj.logback.LogbackApplicationTests][main] log level:warn
[00:05:27.347][ERROR][com.leichuangkj.logback.LogbackApplicationTests][main] log level:error

//error
[00:05:27.347][ERROR][com.leichuangkj.logback.LogbackApplicationTests][main] log level:error