上篇《Spring Boot系列——日志配置》介紹了Spring Boot如何進行日志配置,日志系統用的是Spring Boot默認的LogBack。
事實上,除了使用默認的LogBack,Spring Boot還可以使用Log4j、Log42等作為自己的日志系統。今天就那Log4j2來舉例,說明Spring Boot是如何集成其他日志系統的。
添加jar包依賴
上篇提到過,Spring Boot默認使用LogBack,但是我們沒有看到顯示依賴的jar包,其實是因為所在的jar包spring-boot-starter-logging
都是作為spring-boot-starter-web
或者spring-boot-starter
依賴的一部分。
如果這里要使用Log4j2,需要從spring-boot-starter-web
中去掉spring-boot-starter-logging
依賴,同時顯示聲明使用Log4j2的依賴jar包,具體如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
這里順便插一句,上面的依賴中,我們看到並沒有聲明版本,這是因為我在項目的父級pom文件中引入了dependencyManagement。
大致說下,我們常見的dependency標簽是用來引入需要依賴的jar用的。而dependencyManagement並不能起到同樣的作用,它的作用可以用來聲明版本規范。當在父級pom聲明某個版本的依賴時,如果子pom所在項目並沒有用到的話,是不會依賴這個聲明的jar包的,需要在子pom主動添加依賴才生效,這個父級pom中的dependencyManagement是用來做統一版本的。
具體看rome項目中的父級pom文件配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jackie</groupId>
<artifactId>rome</artifactId>
<version>1.0-SNAPSHOT</version>
<name>rome</name>
<packaging>pom</packaging>
<modules>
<module>springboot</module>
<module>wowjava</module>
</modules>
<properties>
<lombok.version>1.16.18</lombok.version>
<spring.boot.version>2.0.4.RELEASE</spring.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
這里放在denpendencyManagement中的denpendency都聲明了版本,這樣當子pom在繼承這個父pom的時候,比如這里的spring-boot-starter-log4j2
就可以繼承父pom中聲明的2.0.4.RELEASE
,不需要再寫version標簽。這樣做是方便項目的版本統一。
添加配置文件log4j2.xml
在resources目錄下新建一個log4j2.xml文件。
<?xml version="1.0" encoding="UTF-8"?> <configuration>
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout charset="UTF-8" pattern="[%-5p] %d %c - %m%n" />
</Console>
<File name="File" fileName="/Users/jackie/workspace/rome/springboot.log">
<PatternLayout pattern="%m%n" />
</File>
</Appenders>
<Loggers>
<root level="info">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="File" />
</root>
</Loggers>
</configuration>
注意:這里的xml標簽和上篇介紹的差不多,都是定義了日志輸出源以及日志格式的定義等,不在贅述。
但是這樣還不夠,Spring Boot並不知道log4j2.xml是干嘛的,需要通過在application.properties文件中顯示聲明才行
logging.config= classpath:log4j2.xml
運行SpringBootDemoApplication
但是如果我們注釋掉application.properties中的logging.config= classpath:log4j2.xml
,運行SpringBootDemoApplication
可以看出沒有建立關聯,所以log4j2.xml的配置也沒有生效,此時Spring Boot的啟動日志沒有打印到控制台上。
注意,這里有個“潛規則”。如果想在application.properties中注釋掉和配置文件的關系前提下仍然能讀取到配置文件的信息,可以這樣做
將log4j2.xml重命名為log4j2-spring.xml,這樣運行SpringBootDemoApplication也是可以正常按照配置打印日志信息的。
自定義日志配置
根據不同的日志系統,你可以按如下規則組織配置文件名,就能被正確加載:
-
Logback: logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
-
Log4j: log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
-
Log4j2: log4j2-spring.xml, log4j2.xml
-
JDK (Java Util Logging): logging.properties
OK,Spring Boot有關日志配置的介紹就到此為止了,有問題下方留言一起討論。
項目代碼地址
https://github.com/DMinerJackie/rome
請記住這個地址,后面可能很多文章的項目代碼都會集中到這個項目。
取名rome(羅馬),源於諺語Rome was not built in one day。翻譯成中文就是我個人很喜歡的“不積跬步無以至千里,不積小流無以成江海”。
沒有哪一次commit能一步到位建成羅馬,但是都是讓現實越來越靠近夢想!
項目的目錄划分采用《沒做過大項目,但我會建大項目》介紹的“大項目”結構,在每個module中都會有README.md,其主要記錄了網上一些較好的參考資料以及在項目module主題遇到的問題,方便后續翻閱。
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!如果您想持續關注我的文章,請掃描二維碼,關注JackieZheng的微信公眾號,我會將我的文章推送給您,並和您一起分享我日常閱讀過的優質文章。