【问题标题】:how to add custom field to log logback-logstash如何将自定义字段添加到日志 logback-logstash
【发布时间】:2018-08-07 14:20:14
【问题描述】:

我的 Spring Boot 日志目前如下所示。

{"@timestamp":"2018-08-07T14:49:21.244+01:00","@version":"1","message":"Starting Application on ipkiss bla bla)","logger_name":"logger name....","thread_name":"main","level":"INFO","level_value":20000}

如下所示的 logback-spring.xml 设置

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="com.ipkiss.correlate.logback.CorrelationPatternLayoutEncoder">
            <pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} id = %id  %m%n%wEx</pattern>
        </encoder>
</appender>

我的 LayoutEncoder 类看起来像这样

public class CorrelationPatternLayoutEncoder extends PatternLayoutEncoder {
    public CorrelationPatternLayoutEncoder() {

    }

@Override
public void start() {
    PatternLayout patternLayout = new PatternLayout();
    patternLayout.getDefaultConverterMap().put("id", CorrelationConverter.class.getName());
    patternLayout.setContext(context);
    patternLayout.setPattern(getPattern());
    patternLayout.setOutputPatternAsHeader(outputPatternAsHeader);
    patternLayout.start();
    this.layout = patternLayout;
    this.started = true;
}

}

我试图实现的是将 id 添加到日志中,我无法让 logstach 附加我的 id,我根据文档尝试了自定义字段,但我无法使其工作, 有什么想法可以实现吗?

这就是我想要的结果

{"id":"3a7ccd34-d66a-4fcc-a12e-763a395a496c","@timestamp":"2018-08-07T14:49:21.244+01:00","@version":"1","message":"Starting Application on ipkiss bla bla)","logger_name":"logger name....","thread_name":"main","level":"INFO","level_value":20000}

或在日志末尾附加 id。

【问题讨论】:

    标签: spring-boot logstash-logback-encoder


    【解决方案1】:

    来自logstash-encoder github page

    默认情况下,映射诊断上下文 (MDC) (org.slf4j.MDC) 中的每个条目都将显示为 LoggingEvent 中的一个字段。

    简而言之,如果您将 id 条目添加到 MDC 中,它将自动包含在您的所有日志中。

    要将您的 ID 添加到 MDC,请执行以下操作:

    MDC.put("id", uuid);
    

    由于 MDC 是一个线程局部变量,您必须在请求完成使用后清除它

    MDC.remove("id")
    

    在 Web 应用程序中,添加和清除 MDC 中的值通常在 servlet 过滤器中完成。

    public class IdFilter implements Filter{
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            MDC.put("id", UUID.randomUUID().toString());
            try {
                filterChain.doFilter(servletRequest, servletResponse);
            } finally {
                MDC.remove("id");
            }
        }
    }
    

    【讨论】:

    • 如何将 Object 放入 MDC?
    • put 方法是 put(String, String)。你不能传递一个对象。 MDC 用于记录目的,所以我想这就是他们将方法参数限制为字符串的原因。您应该将您的 Object 转换为适合您需要的任何 String 表示形式,然后将其添加到 MDC。这有意义吗?
    【解决方案2】:

    您可以通过创建自定义转换说明符来添加自定义日志字段。 首先创建一个扩展ClassicConverter 类的自定义转换器类。

    import ch.qos.logback.classic.pattern.ClassicConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import java.util.UUID;
    
    public class LogUniqueIdConverter extends ClassicConverter {
    
        @Override
        public String convert(ILoggingEvent event) {
            return String.valueOf(UUID.randomUUID());
        }
    }
    

    ClassicConverter 对象负责从 ILoggingEvent 实例中提取信息并生成字符串。

    所以只需写入您的 logback 配置文件,以便 logback 了解新的转换器。为此,您只需在配置文件中声明新的转换词,如下所示:

    <configuration>
    
      <conversionRule conversionWord="customId" 
                      converterClass="com.naib.util.MySampleConverter" />
            
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>{"id": "%customId" %msg%n%throwable %msg%n}</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>
    

    【讨论】:

    • 我更喜欢这种使用 MDC 的方法,因为如果未设置值,它不会引发异常。至少在不使用自定义编码器时发生在我身上
    • 这缺少正确的类名,对吗?我猜com.naib.util.MySampleConverter 应该是com.naib.util.LogUniqueIdConverter 才有意义。
    • 除了这个非常好的答案之外,如果您使用 IAccessEvent,您可能需要创建一个扩展 AccessConverter 的新类并覆盖 convert 方法。
    • 感谢@MauricioZárate
    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    相关资源
    最近更新 更多