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

6.啓動項目訪問 http://localhost:8080/mylog 就可以在 log.log 文件與控制檯中看到日誌打印的信息。

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

參考項目地址:https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B2

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章