1. 程式人生 > >spring boot 學習(六)spring boot 各版本中使用 log4j2 記錄日誌

spring boot 學習(六)spring boot 各版本中使用 log4j2 記錄日誌

spring boot 各版本中使用 log4j2 記錄日誌

前言

Spring Boot中預設日誌工具是 logback,只不過我不太喜歡 logback。為了更好支援 spring boot 框架,我使用 log4j

spring boot 各版本與 log4j 的支援情況

1. spring boot 1.2.X 版本

spring boot 1.2.X 版本一般建議使用預設日誌工具(logback),也可以使用 log4j。
但,注意的是:Spring Boot 1.2.4.RELEASE包含一個bug,github上關於該問題的解釋。所以,當你通過application.properties

定義日誌級別時,該錯誤會更改父記錄器級別,在最差情況下會更改根記錄器級別。雖然這個bug是修復在1.2.6.RELEASE,我建議至少使用1.2.8.RELEASE(如果你想堅持1.2.x)。
因為 spring boot 現在仍然在快速發展階段,版本更新較快,有時候就會因為版本問題而出現各種奇奇怪怪的bug。

2. spring boot 1.3.X 版本

spring boot 從 1.3.X 版本開始支援 slf4j+log4j/log4j2
* 首先,先解決為什麼使用 SL4J Facade?
對於這個問題,網上已經有許多精彩地點答案了,我就直接附上其中一篇的地址了:為什麼要使用SLF4J而不是Log4J


同時,附上一張工作流程圖:
這裡寫圖片描述

  • 然後,就是在自己的 springboot 專案中使用 log4j。
    補充一下,由於方法一樣,我將slf4j+log4j2放到了1.4.X版本中來應用。
    1.建立一個1.3.X版本的 spring boot 專案(記得排除logback-classic的依賴)。
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
   <exclusions
>
<exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> </exclusions> </dependency>

2.引入 SL4J 依賴。

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.7.19</version>
</dependency>
<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-slf4j-impl</artifactId>
   <version>2.5</version>
</dependency>

3.引入 LOG4J 依賴。

<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-api</artifactId>
   <version>2.5</version>
</dependency>
<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-core</artifactId>
   <version>2.5</version>
</dependency>
<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-jcl</artifactId>
   <version>2.5</version>
</dependency>

順便解釋一下,log4j-jcl工件是Apache Log4J Commons Logging Bridge。 如果你打算將Spring Boot application.properties日誌配置路由到Log4J檔案追加器,那麼它是必需的。
4.新增一個測試Controller

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoggerController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @RequestMapping("/mylog")
    public String index(){
        logger.debug("This is a debug message");
        logger.info("This is an info message");
        logger.warn("This is a warn message");
        logger.error("This is an error message");
        return "success";
    }
}

5.src/main/resources目錄下加入log4j.properties配置檔案
這個,與 spring 框架下的 log4j.properties 通常配置一樣,我就簡單提供一個。

#LOG4J配置
#設定root日誌的輸出級別為INFO,appender為控制檯輸出stdout,檔案輸出為file
log4j.rootLogger=INFO,stdout,file
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p]-[%d{yyyy-MM-dd HH:mm:ss}]-[%c:%L]: %m%n

#只打印級別為ERROR或以上的訊息。
log4j.logger.noModule=FATAL

#對 com.test 包下的配置
log4j.logger.com.test=DEBUG
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.freemarker=WARN
log4j.logger.com.mchange=WARN

#檔案輸出配置
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-5p]-[%d{yyyy-MM-dd HH:mm:ss}]-[%c:%L]: %m%n

3. spring boot 1.4.X 版本

從 spring boot 1.4開始的版本就要用log4j2
1.將上一個專案中有關 log4j 與 slf4j 的有關依賴全部去掉,因為 springboot 已經幫我們集合好了。

      <!--去掉springboot本身日誌依賴-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
          <exclusions>
              <exclusion>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-logging</artifactId>
              </exclusion>
          </exclusions>
      </dependency>

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

2.新增 log4j2.xml 檔案(與 application.properties 同級)。

<?xml version="1.0" encoding="UTF-8"?>
<!--啟動項設定為 trace,載入 springboot 啟動內部各種詳細輸出-->
<Configuration status="trace">
    <Appenders>
        <!--新增一個控制檯追加器-->
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout>
                <pattern>[%-5p] %d %c - %m%n</pattern>
            </PatternLayout>
        </Console>
        <!--新增一個文字追加器,檔案位於根目錄下,名為log.log-->
        <File name="File" fileName="log.log">
            <PatternLayout>
                <pattern>[%-5p] %d %c - %m%n</pattern>
            </PatternLayout>
        </File>
    </Appenders>
    <Loggers>
        <Logger name="com.github" level="debug" />
        <!--記錄 qg.fangrui.boot 包及其子包 debug 及其以上的記錄,並輸出到檔案中-->
        <Logger name="qg.fangrui.boot" level="debug">
            <!-- AppenderRef 可以控制檔案輸出物件-->
            <AppenderRef ref="File" />
        </Logger>
        <!--根記錄全部輸出到控制檯上-->
        <Root level="debug">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

3.在 application.properties 中加入配置檔案的掃描位置
logging.config=classpath:log4j2.xml
4.再次啟動並訪問 http://localhost:8080/mylog
控制檯輸出日誌:
控制檯輸出
日誌檔案:
日誌檔案輸出

4. springboot 1.4.1.RELEASE + slf4j + log4j2

參考資料