spring-boot - 如何将自定义字段添加到日志 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。
解决方案
默认情况下,映射诊断上下文 (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");
}
}
}
推荐阅读
- r - 在 Shiny 中输入信息后渲染图形
- github-actions - 从 GitHub 操作与 Bitbucket 工作流调用时,相同的 shell 脚本会产生不同的结果
- javascript - 为什么波浪号 ~ 在 Javascript querySelector 中不起作用但在 CSS 中起作用?
- common-lisp - 编译 Lambda 表达式时 SBCL 中的微妙编译器警告
- elixir - elixir phoenix liveview - 通过套接字传递用户 ID
- batch-file - MS Dos - 批处理文件中编写的代码未执行
- python - 如何在 Python 中创建多个分布?
- node.js - $centerSphere 没有返回任何东西 MongoDB
- python - Py - 可以在网页中输入文本并静默提取结果吗?
- python - 尝试使用 python 将元素添加到现有 JSON