是否必须创建多个Logback PropertyDefiner实现来引入多个属性?

时间:2014-12-09 23:19:53

标签: properties logback

我可以使用Logback PropertyDefiner从logback.xml配置文件中访问单个属性。如果我有3个属性可以访问,我目前正在使用3个独立的PropertyDefiner实现(每个属性一个)。

有没有办法从单个PropertyDefiner实现访问多个属性?或者可能还有另一个支持多个属性的接口?

我希望能够使用属性为各种日志配置(上下文名称,日志级别,appender文件名,文件大小等)基于环境(dev,ist,uat,perf,prod)插入不同的值)。

我找到this question,它类似,但没有回答如何访问多个属性的问题。

2 个答案:

答案 0 :(得分:7)

创建一个PropertyDefiner实现类。已提供PropertyDefinerBase实施。

package foo.bar;

import java.util.HashMap;
import java.util.Map;

import ch.qos.logback.core.PropertyDefinerBase;

public class LoggingPropertiesDefiner extends PropertyDefinerBase {

  private static Map<String, String> properties = new HashMap<>();

  static {
    properties.put("encoderPattern", "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %message%n");
    properties.put("maxFileSize", "50MB");
    properties.put("rootLogLevel", "INFO");
  }

  private String propertyLookupKey;

  public void setPropertyLookupKey(String propertyLookupKey) {
    this.propertyLookupKey = propertyLookupKey;
  }

  @Override
  public String getPropertyValue() {
    //TODO In the real world, get properties from a properties loader.
    return properties.get(propertyLookupKey);
  }
}

在logback.xml中,为每个属性使用相同的PropertyDefiner类。为每个提供不同的查找键:

<define name="encoderPattern" class="foo.bar.LoggingPropertiesDefiner">
    <propertyLookupKey>encoderPattern</propertyLookupKey>
</define>

<define name="maxFileSize" class="foo.bar.LoggingPropertiesDefiner">
    <propertyLookupKey>maxFileSize</propertyLookupKey>
</define>

<define name="rootLogLevel" class="foo.bar.LoggingPropertiesDefiner">
    <propertyLookupKey>rootLogLevel</propertyLookupKey>
</define>

引用logback.xml中的属性名称:

<root level="${rootLogLevel}">
    <appender-ref ref="FILE"/>
</root>

答案 1 :(得分:1)

您可以使用logback

中的属性资源支持

logback.properties

mode=prod    

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <property resource="logback.properties" />

    <if condition='property("mode").equals("prod")'>
        <then>
            <include file="logback-prod.xml" />
        </then>
    </if>
    <if condition='property("mode").equals("dev")'>
        <then>
            <include resource="logback-dev.xml" />
        </then>
    </if>
</configuration>

的logback-prod.xml

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <!--Daily rolling file appender -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <File>${MYAPP_HOME}/myApp.log</File>
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <FileNamePattern>myApp.%d{yyyy-MM-dd}.log</FileNamePattern>
          <MaxHistory>2</MaxHistory>
          </rollingPolicy>
          <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</Pattern>
          </layout>
    </appender> 

    <root level="ERROR">
        <appender-ref ref="file" />
    </root>
</configuration>

的logback-dev.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--Daily rolling file appender -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <File>${MYAPP_HOME}/myApp.log</File>
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <FileNamePattern>myApp.%d{yyyy-MM-dd}.log</FileNamePattern>
          <MaxHistory>2</MaxHistory>
          </rollingPolicy>
          <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</Pattern>
          </layout>
    </appender> 


    <root level="TRACE">
        <appender-ref ref="file" />
    </root>
</configuration>

更详细的解释here

这有助于解决您的问题吗?