9

我的 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。

4

2 回答 2

7

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");
        }
    }
}
于 2018-08-07T19:14:01.383 回答
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>
于 2020-10-17T07:53:52.470 回答