zoukankan      html  css  js  c++  java
  • 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的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

  • 相关阅读:
    Leetcode 538. Convert BST to Greater Tree
    Leetcode 530. Minimum Absolute Difference in BST
    Leetcode 501. Find Mode in Binary Search Tree
    Leetcode 437. Path Sum III
    Leetcode 404. Sum of Left Leaves
    Leetcode 257. Binary Tree Paths
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
    Leetcode 226. Invert Binary Tree
    Leetcode 112. Path Sum
    Leetcode 111. Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/bigdataZJ/p/spring-boot-log4j2.html
Copyright © 2011-2022 走看看