0

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

例如

<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级别“包含”?

4

1 回答 1

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 配置来共享编码器配置,但不幸的是,这需要将 groovy 添加到您的类路径中。

于 2019-10-16T02:20:31.710 回答