springboot使用log4j2且配置文件中引用pom变量

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是使用log4j的xml配置在Spring Boot记录日志的步骤: 1. 首先,在Spring Boot项目的pom.xml文件添加log4j和log4j-slf4j-impl依赖: ``` <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.14.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.1</version> </dependency> ``` 2. 在src/main/resources目录下创建log4j2.xml文件,添加以下代码: ``` <?xml version="1.0" encoding="UTF-8"?> <Configuration status="INFO"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <RollingFile name="RollingFile" fileName="logs/myapp.log" filePattern="logs/myapp-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <Policies> <SizeBasedTriggeringPolicy size="10 MB"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration> ``` 这个配置文件定义了两个Appender,一个是输出到控制台,一个是输出到日志文件。可以根据自己的需要修改文件名、日志级别等参数。 3. 在Spring Boot配置文件application.properties或application.yml添加以下配置: ``` logging.config=classpath:log4j2.xml ``` 这个配置告诉Spring Boot使用log4j2.xml文件作为日志配置文件。 4. 在代码使用log4j进行日志记录: ``` import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class MyClass { private static final Logger logger = LogManager.getLogger(MyClass.class); public void myMethod() { logger.info("This is a log message."); } } ``` 这个例子,我们定义了一个Logger对象,并在myMethod方法使用info级别记录了一条日志信息。 希望这个步骤可以帮助你在Spring Boot项目使用log4j进行日志记录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员 beige

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值