【问题标题】:How to make Log4j2 configurable by environment using Spring Boot 1.3.6.RELEASE如何使用 Spring Boot 1.3.6.RELEASE 通过环境使 Log4j2 可配置
【发布时间】:2016-12-16 00:25:04
【问题描述】:

我想根据我的 application.properties 更改 log4j2.xml 文件中的一些属性,例如定义一些属性,然后在 log4j2 中替换那些作为参数的属性。

我运行了不同的方法,但仍然没有得到正确的结果。我想根据环境(DEV、QA 或 PROD)有不同的配置。如何做到这一点?

我正在尝试在我的属性中添加它

#Place holders for log4j2.xml file
log.file.path=/opt/tomcat/logs
log.file.name=dummydummy
log.file.size=100 MB
log.level=DEBUG

下面是我的log4j2。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="PID">????</Property>
        <property name="name">my-log</property>
    </Properties>
    <Appenders>
        <RollingFile name="file" fileName="${log.file.path}${log.file}.log"
            filePattern="${log.file.path}${log.file}-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout
                pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${sys:PID} --- [%t] %c{1}(%M:%L) : %m%n%wEx" />
            <Policies>
                <TimeBasedTriggeringPolicy /><!-- Rotated everyday -->
                <SizeBasedTriggeringPolicy size="${log.file.size}" /> <!-- Or every 100 MB -->
            </Policies>
        </RollingFile>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout
                pattern="%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%t]}{faint} %clr{%c{1}(%M:%L)}{cyan} %clr{:}{faint} %m%n%wEx" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="org.hibernate.validator.internal.util.Version"
            level="warn" />
        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
        <Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
        <Logger name="org.springframework.web" level="error" />

        <Root level="${log.level}">
            <AppenderRef ref="Console" />
            <AppenderRef ref="file" />
        </Root>
    </Loggers>
</Configuration>

【问题讨论】:

    标签: properties spring-boot log4j2


    【解决方案1】:

    解决方法,以防您在 log4j2.xml 配置中只需要 不同的属性值 用于不同的弹簧配置文件(开发、测试、产品等) .)。 您可以访问 spring 配置文件,例如:${bundle:application-${sys:spring.profiles.active}:log.file.name}

    应用程序-dev.properties 文件:

    log.file.name=dev_log
    

    application-prod.properties 文件:

    log.file.name=app_name
    

    log4j2.xml 配置:

    <Configuration>
        <Properties>
            <Property name="file_name">${bundle:application-${sys:spring.profiles.active}:log.file.name}</Property>
        </Properties>
        <Appenders>
            <RollingFile name="RollingFile"
                         fileName="/logs/${file_name}.log"
    ...
                     
    

    注意:您必须将 log.file.name 属性添加到 每个弹簧配置文件,log4j2 将其视为单独的文本文件,并且不会从 application.properties 文件等解析默认值。

    【讨论】:

      【解决方案2】:

      从 Log4j 2.13.0 开始,Log4j 2 现在提供 Spring Lookup 作为其 Spring Cloud Config 支持的一部分。它将允许您在 log4j2.xml 中引用 Spring Boot 应用程序的 application.properties 或 application.yml 文件中定义的属性。

      【讨论】:

      【解决方案3】:

      属性查找元素允许从 log4j 配置中的外部属性文件中引用属性。 对于您的示例,它应该是这样的:

      1. env.properties 文件包含以下属性:

        log.file.path=/opt/tomcat/logs
        log.file.name=dummydummy
        log.file.size=100 MB
        log.level=DEBUG
        

      属性查找应定义为 log4j2.xml 的属性:

      <Configuration>  
        <Properties>  
            <property name="log.file.path">${bundle:env:log.file.path}</property>  
            <property name="log.file.name">${bundle:env:log.file.name}</property>  
            <property name="log.file.size">${bundle:env:log.file.size}</property>  
            <property name="log.level">${bundle:env:log.level}</property>   
        </Properties>  
      

      现在可以使用 ${property_name} 表示法在附加程序中引用属性。每个属性引用都将使用 env.properties 中的实际值进行插值。

      您可以找到另一个属性查找示例here

      【讨论】:

      • 感谢您的回复,现在可以使用了。我还有其他问题,如果我有多个属性文件(取决于环境,例如 application.properties、application-dev.properties 等),有没有办法在文件之间切换?似乎 log4j2 只选择默认的 application.properties
      • 您可以为每个环境/属性文件创建一个专用的 log4j2 配置:log4j2-env-dev.xml 和 env-dev.properties,log4j2-env-test.xml 和 env-test.properties 等. 您可以提供 log4j2 配置文件的名称作为 jvm 参数 -Dlog4j.configurationFile=.
      • 如果使用env.yml,怎么办?
      • @Dreampie 我从未将 yml 用于 log4j2。尝试查看文档。
      【解决方案4】:

      确保在类路径中添加 log4j2 启动器,然后在 application.properties 中删除与日志记录相关的属性,然后 spring 将从资源文件夹中加载您的 log4j2.xml。 这样您就可以完全控制日志记录。如果您想替换值,请参考this link

      注意::如果您的项目中有执行器,则删除 spring boot logger starter

      <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-actuator</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>
      

      【讨论】:

      • 感谢您的快速响应,但应用程序正在正常加载 log4j2.xml;但没有用我在属性文件中的值替换变量
      • 这里是 log4j2 使用的字符串替换器的文档:logging.apache.org/log4j/log4j-2.2/log4j-core/apidocs/org/…,确保您使用的值没有在 spring 中定义。因为 spring boot 有智能的方式来加载值
      猜你喜欢
      • 2017-09-07
      • 2018-03-22
      • 2019-05-10
      • 2018-06-14
      • 1970-01-01
      • 2018-10-13
      • 2018-12-21
      • 2019-08-03
      • 2017-09-06
      相关资源
      最近更新 更多