Properties 必须创建多个Logback PropertyDefiner实现才能拉入多个属性吗?

Properties 必须创建多个Logback PropertyDefiner实现才能拉入多个属性吗?,properties,logback,Properties,Logback,我能够使用Logback从Logback.xml配置文件访问单个属性。如果我有3个属性要访问,那么我目前正在使用3个单独的PropertyDefiner实现(每个属性一个) 是否有方法从单个PropertyDefiner实现访问多个属性?或者可能存在另一个支持多个属性的接口 我希望能够使用属性根据环境(dev、ist、uat、perf、prod)为各种日志记录配置(上下文名称、日志级别、附录文件名、文件大小等)插入不同的值 我发现,这与此类似,但没有回答如何访问多个属性的问题。您可以使用logb

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

是否有方法从单个PropertyDefiner实现访问多个属性?或者可能存在另一个支持多个属性的接口

我希望能够使用属性根据环境(dev、ist、uat、perf、prod)为各种日志记录配置(上下文名称、日志级别、附录文件名、文件大小等)插入不同的值


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

您可以使用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>

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

创建一个实现类。已经提供了实现

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);
  }
}
package foo.bar;
导入java.util.HashMap;
导入java.util.Map;
导入ch.qos.logback.core.PropertyDefinerBase;
公共类LoggingPropertiesDefiner扩展PropertyDefinerBase{
私有静态映射属性=new HashMap();
静止的{
properties.put(“encoderPattern”,%d{yyyy-MM-dd HH:MM:ss.SSS}[%thread]-5级别%logger-%message%n”);
properties.put(“maxFileSize”,“50MB”);
properties.put(“rootLogLevel”、“INFO”);
}
私有字符串propertyLookupKey;
public void setPropertyLookupKey(字符串propertyLookupKey){
this.propertyLookupKey=propertyLookupKey;
}
@凌驾
公共字符串getPropertyValue(){
//在现实世界中,从属性加载器获取属性。
返回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>


您能详细说明这些属性是什么以及您打算如何处理它们吗?基于此,我们可以考虑是否还有其他解决方案。PropertyDefiner解决方案似乎只适用于一个属性。我更新了问题的更多细节。我查看了属性资源支持,但正在寻找一种方法来提供java类的挂钩,以便执行属性查找。我找到了一种使用单个PropertyDefiner类公开多个属性的方法。我将添加一个单独的答案来说明这一点。谢谢你的帮助!这是一个非常有用的建议,令人惊讶的是,其他任何地方都没有提及。当你花太多时间在这个主题上查看logback文档时,这绝对是违反直觉的。。。然而,这是一个非常干净的解决方案,尤其是当您只是从属性文件中提取值时。谢谢你,查德!
<root level="${rootLogLevel}">
    <appender-ref ref="FILE"/>
</root>