【问题标题】:logback, How to change message in logging event before appendinglogback,如何在附加之前更改日志事件中的消息
【发布时间】:2018-03-12 20:56:47
【问题描述】:

使用 logback 1.2.3 和 Java 9...

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

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

【问题讨论】:

  • 这是另一个用例,到目前为止给出的答案未涵盖:需要扫描日志消息以获取 PII 信息,并在将其记录到 SocketAppender 之前转换或删除该信息(其中 PatternLayout 不申请)。
  • @user2957009 MessageConverter 返回格式化的消息。所以你可以使用接受的答案来做任何你想做的事情。

标签: logging logback slf4j


【解决方案1】:

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 为每个日志事件返回的任何内容

【讨论】:

  • 完美。刚刚看到 Spring 使用与消息转换器相同的模式。遗憾的是只有转换规则通过类名引用(即 ctx.putObject(CoreConstants.PATTERN_RULE_REGISTRY, conversionRules);)而不是能够提供对象实例。例如,如果我想要一个自定义消息转换器,它有一个带参数的构造函数。
  • 嗨@glytching,我有我的掩码的确切代码,我确实有问题(或者我认为是这样)。我需要找到一种方法来屏蔽 Throwable 的错误堆栈中的一些数据。 MessageConveter 只返回 formattedMessage,它是字符串加上作为数组给出的可选值。但是我找不到可以同时屏蔽消息和完整错误堆栈(包含异常的根本原因)的转换器。使用 ThrowableProxyConverter 将删除 formattedMessage。你以前遇到过这个问题吗?
【解决方案2】:

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

在你的application.yml

my.logging.properties: PropertyOne, PropertyTwo

在你的logback.xml

&lt;springProperty scope="context" name="myLoggingPoperties" source="my.logging.properties"/&gt;

您的编码器模式变为

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

这些属性在您的CustomMessageConverter 中以List&lt;String&gt; 的形式提供

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2011-07-07
    • 2018-09-19
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多