gpt4 book ai didi

logging - 如何在 logback 的编码器模式中显示实例的身份哈希码?

转载 作者:行者123 更新时间:2023-12-04 13:02:57 25 4
gpt4 key购买 nike

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 快照。

最佳答案

Logback的 PatternLayout 包含 defaultConverterMap将转换词( %n%msg%d 等)映射到 ch.qos.logback.core.pattern.Converter 的实现.这就是你所说的:

enhance logging messages with context information like the current thread and the class name



要在日志输出中包含 hashCode,您可以提供自己的 ch.qos.logback.core.pattern.Converter 实现。并将其与自定义转换词相关联,如下所示...
  • 将此添加到 logback.xml
    <conversionRule conversionWord="hc" converterClass="some.package.HashCodeConverter" />
  • 实现 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;
    }
    }
    }
  • 更新您的编码器模式以使用转换字 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 的实现。
  • 尽管上述获取发出日志事件的类的方法是 Logback 中的标准做法,但它确实需要生成堆栈跟踪,并且在大量日志记录环境中为每个日志事件执行此操作可能会非常昂贵。如果是这样,那么在每条消息中包含 hashCode 可能是您唯一的选择。
  • 关于logging - 如何在 logback 的编码器模式中显示实例的身份哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50553914/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com