代码之家  ›  专栏  ›  技术社区  ›  Kalle Richter

如何在logback的编码器模式中显示实例的标识哈希码?

  •  2
  • Kalle Richter  · 技术社区  · 8 年前

    中的编码器模式 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 回复  |  直到 8 年前
        1
  •  1
  •   glytching    8 年前

    退伍军人 PatternLayout 包含 defaultConverterMap %n , %msg %d 等)实施 ch.qos.logback.core.pattern.Converter . 这就是你所说的:

    要在日志输出中包含hashCode,您可以提供自己的 信道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