[英]Slf4j, logback - removing mdc tag from json
我正在使用 MDC 将上下文信息添加到日志记录中:
MDC.put("Correlation-ID", UUID.randomUUID().toString());
我正在使用以下 logback 编码器:
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
<timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
<appendLineSeparator>true</appendLineSeparator>
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>false</prettyPrint>
</jsonFormatter>
</layout>
</encoder>
我有以下日志:
{"timestamp":"2020-01-20T11:40:09.850Z","level":"INFO","thread":"main","mdc":{"Correlation-ID":"66f7843c-9855-450d-ad97-b1c78404f051"},"logger":"liquibase.Liquibase"...
我想删除根 mdc 标记以获得:
{"timestamp":"2020-01-20T11:40:09.850Z","level":"INFO","thread":"main","Correlation-ID":"66f7843c-9855-450d-ad97-b1c78404f051","logger":"liquibase.Liquibase"...
我将如何实现这一目标?
这是一个简单的解决方案,使用<includeMDC>false</includeMDC>
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout"> <appendLineSeparator>true</appendLineSeparator> <includeMDC>false</includeMDC> <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter"> <prettyPrint>true</prettyPrint> </jsonFormatter> </layout>
如果您想保留关联 ID,您可以扩展 JSON 布局类并在地图上设置属性。
public class CustomJsonLayout extends JsonLayout {
@Override
protected Map toJsonMap(ILoggingEvent iLoggingEvent) {
LinkedHashMap var2 = new LinkedHashMap();
this.addTimestamp("timestamp", this.includeTimestamp, iLoggingEvent.getTimeStamp(), var2);
this.add("level", this.includeLevel, String.valueOf(iLoggingEvent.getLevel()), var2);
this.add("thread", this.includeThreadName, iLoggingEvent.getThreadName(), var2);
this.add("logger", this.includeLoggerName, iLoggingEvent.getLoggerName(), var2);
this.add("message", this.includeFormattedMessage, iLoggingEvent.getFormattedMessage(), var2);
this.add("raw-message", this.includeMessage, iLoggingEvent.getMessage(), var2);
this.add("context", this.includeContextName, iLoggingEvent.getLoggerContextVO().getName(), var2);
this.addThrowableInfo("exception", this.includeException, iLoggingEvent, var2);
this.addCustomDataToJsonMap(var2, iLoggingEvent);
Map<String,String> mdc = iLoggingEvent.getMDCPropertyMap();
String correlationId = mdc.getOrDefault("Correlation-ID","");
this.add("Correlation-ID", this.includeMDC, correlationId , var2);
return var2;
}
}
并在布局中添加新类。
<layout class="com.test.utils.CustomJsonLayout">
您可以使用logstash logback JSON 编码器。
将这些依赖项添加到您的pom.xml中:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>${logstash.version}</version>
</dependency>
这是一个示例:
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<omitEmptyFields>true</omitEmptyFields>
<pattern>
{
"timestamp": "%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}",
"level": "%level",
"thread": "%t",
"Correlation-ID": "%mdc{Correlation-ID}",
"logger": "%logger",
...
}
</pattern>
</pattern>
</providers>
</encoder>
文档在这里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.