Spring Boot系列——如何集成Log4j2


上篇《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的微信公眾號,我會將我的文章推送給您,並和您一起分享我日常閱讀過的優質文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM