1. 程式人生 > >SpringBoot學習筆記-日誌

SpringBoot學習筆記-日誌

SpringBoot學習筆記-日誌

Table of Contents

1 SpringBoot與日誌

1.1 常見的日誌框架

  • JUL: java.util.logging
  • JCL: Jakarta Commons Logging
  • JBoss-logging
  • logback
  • log4j
  • log4j2
  • slf4j: Simpe Logging Facade for java
日誌的抽象層 日誌實現
JCL,SLF4j,jboss-logging Log4j, JUL, Log4j2, Logback
  • 最常用的日誌抽象層選擇: SLF4j
  • 日誌實現選擇: Logback
  • SpringBoot底層是Spring框架, Spring框架預設使用JCL.
  • SpringBoot選用SLF4j和Logback

1.2 SLF4j使用

1.2.1 如何在系統中使用SLF4j

  • 匯入slf4j的jar包和logback的實現jar包
  • 使用程式碼案例
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(HelloWorld.class);
        logger.info("Hello World");
    }
}
  • 圖示

concrete-bindings.png

1.2.2 遺留問題

  • 不同框架整合時, 不同的框架可能使用了不同的日誌框架, 需要統一日誌記錄.
  • 將其他框架中其他日誌框架先排除出去
  • 用適配包替換原來的日誌介面包
  • 使用slf4j其他的實現
  • 圖示

legacy.png

1.3 SpringBoot日誌關係

  • SpringBoot底層也是使用 slf4j + logback 的方式進行日誌記錄.
  • SpringBoot也把其他的日誌介面層替換成了slf4j介面層.
public abstract class LogFactory {

    static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";

    // 把工廠類換成了SLF4J工廠類
    static LogFactory logFactory = new SLF4JLogFactory();
}
  • 如果我們要引入其他框架,一定要把這個框架的預設日誌依賴移除掉.以下是SpringBoot的用法.
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
  • SpringBoot底層日誌依賴關係圖

legacy2.png

1.4 SpringBoot日誌使用

  • 使用日誌測試程式碼
package com.devinkin.springboot;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot03LoggingApplicationTests {

    // 日誌記錄器
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Test
    public void contextLoads() {
        //        System.out.println();
        // 日誌的級別:由低到高
        // trace<debug<info<warn<error
        // 可以調整需要輸出的日誌級別: 日誌就只會在這個級別及以後的高級別生效
        logger.trace("這是trace日誌...");
        logger.debug("這是debug日誌...");
        // SpringBoot預設使用的是info級別的, 沒有指定級別的就使用SpringBoot預設規定的級別
        logger.info("這是info日誌...");
        logger.warn("這是warn日誌...");
        logger.error("這是error日誌...");
    }

}
  • 設定日誌的級別: logging.level
logging:
  level:
    com.devinkin: trace
  • 指定日誌的檔名: logging.file ,會在當前專案下生成springboot.log日誌
logging:
  file: springboot.log
  • 指定日誌的檔案的目錄: logging.path , 日誌檔名稱使用SpringBoot預設的輸出日誌檔名.
    • 如果同時指定了 logging.file , 則使用 logging.file , 不會使用 logging.path
logging:
    path: /home/devinkin/JavaCode/WebBackEnd/SpringBoot/spring-boot-03-logging/log
  • 指定日誌在控制檯輸出的格式: logging.pattern.console
logging:
  console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"
  • 指定檔案中日誌輸出的格式: logging.pattern.file
logging:
  file: "%d{yyyy-MM-dd HH:mm:ss.SSS} === [%thread] === %-5level === %logger{50} === %msg%n"
  • 日誌的輸出格式
符號 含義
%d 表示日期時間
%thread 表示執行緒名
%-5level 表示logger名字最長50字元,否則按照句點分割
%msg 日誌訊息
%n 換行符

1.5 SpringBoot指定日誌檔案的配置

  • 在類路徑下放每個日誌框架自己的配置檔案即可, SpringBoot就不使用它預設日誌配置檔案
Logging System Customization
Logback logback.spring.xml, logback.spring.groovy, logback.xml, logback.groovy
Log4j2 log4j2.spring.xml, log4j2.xml
JDK(Java Util Logging) logging.properties
  • 帶spring字尾名, 日誌框架就會被SpringBoot載入, 就能使用SpringBoot的高階功能. <springProfile>
    • 在開發環境下的輸出格式和非開發環境下的輸出格式
<springProfile name="dev">
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
</springProfile>
<springProfile name="!dev">
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
</springProfile>
  • 設定SpringBoot為開發環境下執行
spring:
  profiles:
    active: dev

1.6 SpringBoot切換日誌框架

  • 可以按照slf4j的日誌適配圖,進行相關的切換
  • 使用 slf4j + log4j 的方式
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>logback-classic</artifactId>
            <groupId>ch.qos.logback</groupId>
        </exclusion>
        <exclusion>
            <artifactId>log4j-over-slf4j</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
  • 切換為log4j2框架
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <artifactId>spring-boot-starter-logging</artifactId>
      <groupId>org.springframework.boot</groupId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

Date: 2018-11-24 19:49

Author: devinkin

Created: 2018-11-25 日 00:18

Validate