在Logback xml中为不同的附加程序共享相同的编码器设置

时间:2019-10-16 00:47:58

标签: spring spring-boot logging logback logstash-logback-encoder

我有一个使用net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder的编码器,可以通过混合使用库存提供程序,模式和自定义提供程序来配置日志内容。在不同的附加程序中使用相同的内容,例如控制台,文件,滚动文件和用于单元测试的自定义文件。我不想在每个附加器中重复相同的配置,因为它是完全相同的,所以我想知道是否存在一种在不同附加器之间共享它的方法吗?

例如

<configuration>
  <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender">
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
      ... configuration can be shared ...
    </encoder>
  </appender>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
      ... repeated the exact same configuration ...
    </encoder>
  </appender>

我知道有此“包含”功能,但似乎必须从根级别(即appender)开始才能包含。是否可以在encoder级别“包含”?

1 个答案:

答案 0 :(得分:1)

不幸的是,logback没有提供在xml配置文件中完全共享编码器配置的方法。

相反,您可以

  1. 定义一个扩展net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder的类,
  2. 在该类中以编程方式执行配置,然后
  3. 在xml中引用您的类。

例如:

public class JsonEncoder extends LoggingEventCompositeJsonEncoder {
    public JsonEncoder() {
    }
    @Override
    public void start() {
        // Note: you can access logback properties via getContext().getProperty(...)

        JsonProviders<ILoggingEvent> providers = getProviders();
        providers.addProvider(new LoggingEventFormattedTimestampJsonProvider());
        providers.addProvider(new LogLevelJsonProvider());
        providers.addProvider(new MessageJsonProvider());
        providers.addProvider(new ThreadNameJsonProvider());
        providers.addProvider(new LoggerNameJsonProvider());
        providers.addProvider(new MdcJsonProvider());
        providers.addProvider(new LogstashMarkersJsonProvider());
        providers.addProvider(new StackTraceJsonProvider());
        providers.addProvider(new ArgumentsJsonProvider());
        super.start();
    }
}
<configuration>
  <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender">
    <encoder class="your.package.JsonEncoder"/>
  </appender>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="your.package.JsonEncoder"/>
  </appender>

您还可以放弃logback.xml并转到完整的程序配置,在该配置中,您将使用工厂方法来创建每个编码器。请注意,每个附加程序都需要单独的编码器实例,但是您可以相同地构造每个编码器实例。

此外,我还没有亲自尝试过,但是您可以使用groovy configuration共享编码器配置,但是不幸的是,这需要在您的类路径中添加常规代码。