springboot在log4j2配置文件中引用pom变量
引入log4j2
首先需要引入log4j2,而spring boot默认使用的是logback,需要排除默认的log组件。logback性能不如log4j2优秀,所以我们换成log4j2。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入log4j2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
配置log4j2
引入后,spring-boot-starter-log4j2会有默认的配置,然后笔者的需求是修改日志打印的路径,不同环境使开启不同的日志级别等,所以要修改其配置文件
比如我的配置文件是resources目录下创建log4j2-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<appenders>
<console name="CONSOLE" target="SYSTEM_OUT">
<patternLayout charset="UTF-8" pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p] [%t] (%c:%L) - %m%n" />
</console>
<rollingFile name="ROLLINGFILE_INFO" fileName="${log_file_root}/info.log" filePattern="${log_file_root}/info.log.%date{yyyyMMdd}.log">
<filters>
<ThresholdFilter level="INFO" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/>
</filters>
<patternLayout charset="UTF-8" pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p] [%t] (%c:%L) - %m%n" />
<policies>
<timeBasedTriggeringPolicy />
</policies>
</rollingFile>
<rollingFile name="ROLLINGFILE_ERROR" fileName="${log_file_root}/error.log" filePattern="${log_file_root}/error.log.%date{yyyyMMdd}.log">
<filters>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
</filters>
<patternLayout charset="UTF-8" pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p] [%t] (%c:%L) - %m%n" />
<policies>
<timeBasedTriggeringPolicy />
</policies>
</rollingFile>
</appenders>
<loggers>
<logger name="com.xxx.xxx" level="${log_app_level}" additivity="false">
${log_app_appender}
</logger>
<root level="${log_root_level}">
${log_app_appender}
</root>
</loggers>
</configuration>
使用maven变量
以上,用了许多变量比如,${log_file_root}、${log_app_appender}
这些变量,我们希望不同的环境取不同的值
那么我们可以利用maven的profile来实现
<profiles>
<profile>
<id>dev</id>
<properties>
<log_file_root>/usr/local/log/${log.file}</log_file_root>
<log_app_level>debug</log_app_level>
<log_app_appender>
<![CDATA[
<appender-ref ref="CONSOLE" />
]]>
</log_app_appender>
<log_root_level>debug</log_root_level>
<log_root_appender>
<![CDATA[
<appender-ref ref="CONSOLE" />
]]>
</log_root_appender>
</properties>
</profile>
<profile>
<id>release</id>
<properties>
<!-- log -->
<log_file_root>/usr/local/log/${log.file}</log_file_root>
<log_app_level>info</log_app_level>
<log_app_appender>
<![CDATA[
<appender-ref ref="ROLLINGFILE_INFO" />
<appender-ref ref="ROLLINGFILE_ERROR" />
]]>
</log_app_appender>
<log_root_level>error</log_root_level>
<log_root_appender>
<![CDATA[
<appender-ref ref="ROLLINGFILE_INFO" />
<appender-ref ref="ROLLINGFILE_ERROR" />
]]>
</log_root_appender>
</properties>
</profile>
</profiles>
可以看到,上面有两个环境的配置,分别是dev和release。我们打包时命令加上对应的环境名即可,例如:clean install -Dmaven.test.skip=true -P release
但是
spring boot 2.0 默认的变量符号是@变量名@,我们上面用的是${},所以需要将它改成${变量名},在pom文件build节点下引入maven-resource-plugin,然后设置useDefaultDelimiters = true,变量的符号就变成了${}
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>
</plugins>
</build>
这样配置完后,笔者发现打包完成后的xml文件中,变量并没有被替换掉,还是${变量名}的字符串形式,还需要增加以下配置
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>
</plugins>
</build>
再次打包,${log_file_root}、${log_app_appender}已经打入xml文件中了。
至于为什么在配置中增加了resource目录的过滤就好了,也许是这样才能在打包时处理一遍这个目录,希望有懂的大佬交流一下。
参考:https://blog.csdn.net/chen_blog/article/details/107222088