Как отобразить идентификационный хэш-код экземпляра в шаблоне кодера logback? - PullRequest
0 голосов
/ 27 мая 2018

Шаблон кодера в logback.xml, как

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

, позволяет расширять протоколирование сообщений с помощью контекстной информации, такой как текущий поток и имя класса.Есть ли возможность отображать хеш-код идентификации (возвращаемый System.identityHashcode(Object)) в сообщениях?Я не возражаю против пользовательского расширения в форме подкласса, хотя конфигурация для класса или пакета будет хорошей.Я просто не знаю, с чего начать.

Я знаю, что могу обойти эту проблему, добавив System.identityHashcode к каждому сообщению журнала.Идея этого вопроса заключается в том, чтобы обеспечить настраиваемый подход.

Я получаю доступ к logback-classic 1.2.3 через SLF4J API 1.7.25, но не против обновить снимок до 1.8.x.

1 Ответ

0 голосов
/ 29 мая 2018

Logback's PatternLayout содержит defaultConverterMap, который отображает слова преобразования (%n, %msg, %d и т. Д.) В реализации ch.qos.logback.core.pattern.Converter.Это то, что вы называете:

улучшение регистрации сообщений с помощью контекстной информации, такой как текущий поток и имя класса

Чтобы включить hashCode в вывод журнала, вы могли быпредоставьте свою собственную реализацию ch.qos.logback.core.pattern.Converter и свяжите ее с пользовательским словом преобразования следующим образом ...

  1. Добавьте это к logback.xml

    <conversionRule conversionWord="hc" converterClass="some.package.HashCodeConverter" />
    
  2. Реализуйте some.package.HashCodeConverter следующим образом:

    import ch.qos.logback.classic.pattern.ClassicConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.CallerData;
    
    public class HashCodeConverter extends ClassicConverter {
        @Override
        public String convert(ILoggingEvent le) {
            StackTraceElement[] cda = le.getCallerData();
            if (cda != null && cda.length > 0) {
                return Integer.toString(System.identityHashCode(cda[0]));
            } else {
                return CallerData.NA;
            }
        }
    }
    
  3. Обновите ваш кодировщик, чтобы использовать слово преобразования hc:

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

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

2018-05-29 09:30:09|[main]|INFO |o.g.sandbox.logback.LogbackTest|1847637306|hello! 

Где 1847637306 - это хэш-код для класса, который отправил событие журнала.

Примечания:

  • В приведенной выше реализации я предполагаю, что интересующий вас hashCode является hashCode класса, который отправил событие журнала.Если это не то, что вас интересует, то вы бы изменили реализацию HashCodeConverter
  • . Хотя вышеприведенный подход к получению класса, выдавшего событие logging, является стандартной практикой в ​​Logback, он требует генерацииотслеживание стека и выполнение этого для каждого события журнала может быть чрезмерно дорогим в среде с большим объемом записи.Если это так, то включение hashCode в каждое сообщение может быть единственным вариантом.
...