首页 > 解决方案 > 如何将自定义字段添加到日志 logback-logstash

问题描述

我的 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-bootlogstash-logback-encoder

解决方案


logstash-encoder github 页面

默认情况下,映射诊断上下文 (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");
        }
    }
}

推荐阅读