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

wyc*_*yck 5 properties logback

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

有没有办法从单个PropertyDefiner实现访问多个属性?或许还有另一个支持多个属性的界面?

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

我发现这个问题类似,但没有回答如何访问多个属性的问题.

wyc*_*yck 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

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

<root level="${rootLogLevel}">
    <appender-ref ref="FILE"/>
</root>
Run Code Online (Sandbox Code Playgroud)