Используя logback 1.2.3 и Java 9 ...

Погуглил, пытаясь найти встроенный способ изменить сообщение журнала до того, как оно попадет в приложение. Единственный способ - через макет косой черты кодировщика? В основном ищу что-то вроде обогащения, предоставляемого Serilog, где вы можете изменить сообщение (событие) до того, как оно упадет в приемник.

Вот пример использования: до того, как событие журнала попадет в приложение, требуется ловушка, по крайней мере, для изменения текста сообщения.

4
Matthew Campbell 12 Мар 2018 в 23:56

2 ответа

Лучший ответ

PatternLayout содержит {{ X1}}, который сопоставляет слова преобразования (%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>
    

После внесения этих изменений ваш пользовательский преобразователь будет задействован, и вывод будет включать все, что CustomMessageConverter.convert возвращает для каждого события журнала.

6
glytching 13 Мар 2018 в 09:57

Просто расширяя ответ на гличтинг, вы можете передать свойство 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();
  // ...
}
0
Steve Lohse 28 Июл 2019 в 04:35