logback,如何在附加之前更改日志记录事件中的消息

logback, How to change message in logging event before appending

使用 logback 1.2.3 和 Java 9...

用 Google 搜索试图找到一种内置的方法来在日志消息到达附加程序之前更改日志消息。是通过编码器斜杠布局的唯一方法吗?基本上是寻找 Serilog 提供的类似丰富的内容,您可以在其中更改消息(事件),然后再将其放入接收器。

这里是用例:在日志事件到达附加程序之前,需要一个钩子来至少更改消息文本。

Logback 的 PatternLayout 包含 defaultConverterMap,它将转换词(%msg%n%ex 等)映射到 ch.qos.logback.core.pattern.Converter 的实现。

您可以提供自己的 MessageConverter 实现并将其与自定义转换词相关联,如下所示:

  1. 将此添加到 logback.xml

     <!-- using mx to imply 'message extended' -->
     <conversionRule conversionWord="mx" converterClass="some.package.CustomMessageConverter" />
    
  2. 实现some.package.CustomMessageConverter如下:

     import ch.qos.logback.classic.pattern.MessageConverter;
     import ch.qos.logback.classic.spi.ILoggingEvent;
    
     public class CustomMessageConverter extends MessageConverter {
    
         public String convert(ILoggingEvent event) {
             return enhance(super.convert(event));
         }
    
         // implement your "hook ... to at least alter the message text"
         private String enhance(String incoming) {
             // ...
         }
     }
    
  3. 更新编码器模式以使用转换词 mx:

     <encoder>
         <pattern>%d{yyyy-MM-dd HH:mm:ss}|[%thread]|[%X{complexNestedValue:-NA}]|%-5level|%logger{36}|%mx %n</pattern>
     </encoder>
    

完成这些更改后,您的自定义转换器将被启用,并且输出将包括每个日志事件的任何 CustomMessageConverter.convert returns

只是扩展了 glytching 的答案,如果需要,您可以将 Spring 属性 传递给 CustomMessageConverter

在你的application.yml

my.logging.properties: PropertyOne, PropertyTwo

在你的logback.xml

<springProperty scope="context" name="myLoggingPoperties" source="my.logging.properties"/>

您的编码器模式变为

<encoder>
    <pattern>%d{yyyy-MM-dd HH:mm:ss}|[%thread]|[%X{complexNestedValue:-NA}]|%-5level|%logger{36}|%mx{${myLoggingPoperties}} %n</pattern>
</encoder>

这些属性在您的 CustomMessageConverter

中作为 List<String> 提供
// implement your "hook ... to at least alter the message text"
private String enhance(String incoming) {
  List<String> properties = getOptionList();
  // ...
}