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
的依賴)。
1
2
3
4
5
6
7
8
9
10
|
<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 依賴。
1
2
3
4
5
6
7
8
9
10
|
<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 依賴。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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 通常配置一樣,我就簡單提供一個。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#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 已經幫我們集合好了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<!--去掉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 同級)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?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