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主题遇到的问题,方便后续翻阅。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

Spring Boot开发Web应用

《SpringBoot快速入门》 中我们完成了一个简单的RESTful Service,体验了快速开发的特性。在留言中也有朋友提到如何把处理结果渲染到页面上。那...

21560
来自专栏大魏分享(微信公众号:david-share)

干货分享:基于JBoss的七个Java应用场景

声明 本文主要是针对EAP7的相关实验的记录,本文仅供参考。仅代表作者的个人观点。 在实验过程中,笔者得到了舒服力和Kylin的大力帮助,很多代码的revie...

37050
来自专栏F_Alex

SpringCloud-微服务的注册与发现Eureka(二)

16.2K40
来自专栏C++

Windows编译Opencv

22240
来自专栏飞雪无情的博客

Android Gradle 入门

Gradle是一款非常优秀的构建系统工具,它的DSL基于Groovy实现,可以让你很方便的通过代码控制这些DSL来达到你构建的目的,其构建的大部分功能都是通过插...

14840
来自专栏云计算教程系列

​如何使用Nginx反向代理配置SSL加密的Jenkins

默认情况下,Jenkins自带内置的Winstone网络服务器,可以通过8080端口进行监听,方便入门。但是,只要您认真使用Jenkins,就应该使用SSL保护...

31740
来自专栏CodeSheep的技术分享

Spring Boot日志框架实践

23570
来自专栏运维技术迷

连仕彤博客pyenv环境部署

pyenv是一款Python多版本管理工具,它可以很好的管理Python解释器、Python版本和Python虚拟环境,对于日常开发中,是一款很有必要安装的利器...

35350
来自专栏玩转JavaEE

Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享

小伙伴们好久不见!最近略忙,博客写的有点少,嗯,要加把劲。OK,今天给大家带来一个JavaWeb中常用的架构搭建,即Nginx+Tomcat搭建服务集群,然后通...

44660
来自专栏微信公众号:Java团长

SpringMVC与Struts2的区别与比较总结

1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟...

11130

扫码关注云+社区

领取腾讯云代金券