我有一个使用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
级别“包含”?
答案 0 :(得分:1)
不幸的是,logback没有提供在xml配置文件中完全共享编码器配置的方法。
相反,您可以
net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder
的类,例如:
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共享编码器配置,但是不幸的是,这需要在您的类路径中添加常规代码。