SpringBoot學習筆記-日誌
阿新 • • 發佈:2018-11-25
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"); } }
- 圖示
1.2.2 遺留問題
- 不同框架整合時, 不同的框架可能使用了不同的日誌框架, 需要統一日誌記錄.
- 將其他框架中其他日誌框架先排除出去
- 用適配包替換原來的日誌介面包
- 使用slf4j其他的實現
- 圖示
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底層日誌依賴關係圖
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
Created: 2018-11-25 日 00:18