笔者最近创建了一个新的spring boot 工程,项目要发布到测试环境用docker来跑,日志需要输出到指定目录映射出来查看,就想着配置一下log。
首先介绍如何引入log4j2,spring boot 不做修改默认使用的是logback,性能不如log4j2优秀,所以我们换成log4j2。
我们要在pom中先将默认的logging(里面用的Logbak)包排除,排除的方法有很多,由于笔者采用分模块打包的形式,所有项目有一个根pom,我选择在根pom的 dependencyManagement 依赖管理中排除这个包
org.springframework.boot
spring-boot-starter
2.2.6.RELEASE
org.springframework.boot
spring-boot-starter-logging
如此一来,子模块引入的spring-boot-starter里面都不包含spring-boot-starter-logging的
然后我们在需要打印log的模块中引入spring-boot-starter-log4j2就可以了
org.springframework.boot
spring-boot-starter-log4j2
引入后,spring-boot-starter-log4j2会有默认的配置,然后笔者的需求是修改日志打印的路径,所以要修改其配置文件
我们在resources目录下创建log4j2-spring.xml,注意这样命名是为了spring可以自动加载我们的配置文件,当前你也可以随便起名字,那就需要你在application.yml配置中指定你的配置文件名
logging:
config: 你的配置文件名
个人比较喜欢它原生的日志格式,想在它默认配置下只修改文件目录,于是在 spring-boot这个jar包里面的org.springframework.boot.logging.log4j2下找到默认配置log4j2.xml
%xwEx
%5p
yyyy-MM-dd HH:mm:ss.SSS
%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} %pid --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
只需要在里面增加文件配置就可以了,修改后的文件如下
${project.name}
/mnt/logs/${project.name}/${hostName}
%xwEx
%5p
yyyy-MM-dd HH:mm:ss.SSS
%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} %pid --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
在模块多的情况下,笔者不想每个文件都要改,于是引用了pom里面的变量project.name,如果不做任何配置,会把这两个变量当成字符串,然后真的打到${project.name}目录下面
接下来我们解决这个问题
spring boot 2.0 默认的变量符号是@变量名@,我们将它改成${变量名},在pom文件build节点下引入maven-resource-plugin,然后设置useDefaultDelimiters = true,变量的符号就变成了${}
org.springframework.boot
spring-boot-maven-plugin
org.apache.maven.plugins
maven-resources-plugin
UTF-8
true
这样配置完后,笔者发现打包完成后的xml文件中,变量并没有被替换掉,还是${}的形式,还需要增加以下配置
src/main/resources
true
org.springframework.boot
spring-boot-maven-plugin
org.apache.maven.plugins
maven-resources-plugin
UTF-8
true
再次打包,project.name已经打入xml文件中了。(hostName会在运行时加入系统变量中,所以这个打完包仍然是${hostName},不影响最终的日志输出目录)
至于为什么在配置中增加了resource目录的过滤就好了,也许是这样才能在打包时处理一遍这个目录(猜的),希望有懂的大佬交流一下。