logback,如何在追加

时间:2018-03-12 20:56:47

标签: logging logback slf4j

使用logback 1.2.3和Java 9 ...

在尝试找到一种内置方法来更改日志消息,然后才能到达appender。是编码器斜线布局的唯一方法吗?基本上寻找像Serilog提供的类似浓缩的东西,你可以在它变成水槽之前改变信息(事件)。

以下是用例:在日志事件进入appender之前,需要一个钩子来至少改变消息文本。

2 个答案:

答案 0 :(得分:3)

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.CustomMessageConverter;
    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>
    
  4. 进行这些更改后,您的自定义转换器将被启用,输出将包含每个日志事件的CustomMessageConverter.convert返回值

答案 1 :(得分:0)

只需扩展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>

这些属性在您的List<String>中以CustomMessageConverter的形式提供

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