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>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>com.jackie<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>rome<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>1.0-SNAPSHOT<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"><<span class="hljs-name">name</span>></span>rome<span class="hljs-tag"></<span class="hljs-name">name</span>></span>
<span class="hljs-tag"><<span class="hljs-name">packaging</span>></span>pom<span class="hljs-tag"></<span class="hljs-name">packaging</span>></span>
<span class="hljs-tag"><<span class="hljs-name">modules</span>></span>
<span class="hljs-tag"><<span class="hljs-name">module</span>></span>springboot<span class="hljs-tag"></<span class="hljs-name">module</span>></span>
<span class="hljs-tag"><<span class="hljs-name">module</span>></span>wowjava<span class="hljs-tag"></<span class="hljs-name">module</span>></span>
<span class="hljs-tag"></<span class="hljs-name">modules</span>></span>
<span class="hljs-tag"><<span class="hljs-name">properties</span>></span>
<span class="hljs-tag"><<span class="hljs-name">lombok.version</span>></span>1.16.18<span class="hljs-tag"></<span class="hljs-name">lombok.version</span>></span>
<span class="hljs-tag"><<span class="hljs-name">spring.boot.version</span>></span>2.0.4.RELEASE<span class="hljs-tag"></<span class="hljs-name">spring.boot.version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">properties</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependencyManagement</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependencies</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.projectlombok<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>lombok<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>${lombok.version}<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>${spring.boot.version}<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-log4j2<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>${spring.boot.version}<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-test<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">scope</span>></span>test<span class="hljs-tag"></<span class="hljs-name">scope</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>${spring.boot.version}<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependencies</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependencyManagement</span>></span>
</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>
<span class="hljs-tag"><<span class="hljs-name">File</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"File"</span> <span class="hljs-attr">fileName</span>=<span class="hljs-string">"/Users/jackie/workspace/rome/springboot.log"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">PatternLayout</span> <span class="hljs-attr">pattern</span>=<span class="hljs-string">"%m%n"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">File</span>></span>
<span class="hljs-tag"></<span class="hljs-name">Appenders</span>></span>
<span class="hljs-tag"><<span class="hljs-name">Loggers</span>></span>
<span class="hljs-tag"><<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"info"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">AppenderRef</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"CONSOLE"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">AppenderRef</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"File"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">root</span>></span>
<span class="hljs-tag"></<span class="hljs-name">Loggers</span>></span>
</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 的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。