erw*_*wan 5 logging logback logstash logstash-logback-encoder
在 JVM 项目中,我们使用 Logstash 在生产服务器上记录带有附加 JSON 数据的消息。
问题是 JSON 很难在控制台中读取。因此,我尝试更改为本地(开发)配置以使用 PatternLayoutEncoder 并在本地拥有漂亮、干净的日志。
我发现这个问题: https ://github.com/logstash/logstash-logback-encoder/issues/136
结论是,使用 Logstash logback 编码器 5.0,我们现在可以将键/值对与结构化参数统一起来。
我这样做了,效果很好,但我遇到的问题是,现在在 Logstash 上,这些对在消息和 JSON 中都会重复。
ch.qos.logback.classic.encoder.PatternLayoutEncodernet.logstash.logback.encoder.LogstashEncoder要么我这样做:
LOGGER.info("Some message", kv("user_id", 1));
Run Code Online (Sandbox Code Playgroud)
Logstash json 是这样的:
{ message: "Some message", user_id: 1 }
Run Code Online (Sandbox Code Playgroud)
但控制台日志没有参数:
2018-04-10 08:38:38,042 INFO - Some message
Run Code Online (Sandbox Code Playgroud)
或者我这样做:
LOGGER.info("Some message {}", kv("user_id", 1));
Run Code Online (Sandbox Code Playgroud)
Logstash json 有重复的信息(不好):
{ message: "Some message user_id=1", user_id: 1 }
Run Code Online (Sandbox Code Playgroud)
控制台日志就是我想要的:
2018-04-10 08:38:38,042 INFO - Some message user_id=1
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
如何配置日志,以便以干净的方式在控制台中获取附加信息,但不会在 JSON 中重复它们?
ArrayList<Object> argumentList = new ArrayList<>();
argumentList.add(StructuredArguments.kv("system", "MySystem"));
argumentList.add(StructuredArguments.kv("id", 1234L));
argumentList.add(StructuredArguments.kv("method", "MyMethod"));
log.info("some message", argumentList.toArray());
Run Code Online (Sandbox Code Playgroud)
参数数组转换器:
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static java.util.Arrays.stream;
import static java.util.Optional.ofNullable;
public class ArgumentArrayConverter extends ClassicConverter {
@Override
public String convert(ILoggingEvent iLoggingEvent) {
List<String> allArgs = new ArrayList<>();
ofNullable(iLoggingEvent.getArgumentArray()).ifPresent(a ->
stream(a)
.forEach(o -> allArgs.add(o.toString())));
stream(iLoggingEvent.getMDCPropertyMap()
.entrySet()
.toArray())
.forEach(o -> allArgs.add(o.toString()));
Collections.sort(allArgs);
return !allArgs.isEmpty() ? allArgs.toString() : "";
}
Run Code Online (Sandbox Code Playgroud)
}
本地登录配置:
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<conversionRule conversionWord="argumentArray" converterClass="com.nordea.swo.digi.ncr.config.logging.ArgumentArrayConverter" />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern> %date{"yyyy-MM-dd'T'HH:mm:ss,SSSZ", CET} %clr(%-5level) --- [%15.-15t] %cyan(%-40.40logger{39}) : %msg%argumentArray\r\n</Pattern>
</layout>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
logback 配置其他环境:
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<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>
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>false</prettyPrint>
</jsonFormatter>
<appendLineSeparator>true</appendLineSeparator>
</layout>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
输出本地:
some message[id=1234, method=MyMethod, system=MySystem]
Run Code Online (Sandbox Code Playgroud)
输出其他环境:
{with timestamp and other thingies as well. . ." id":"1234", "method":"MyMethod", "system":"MySystem"}
Run Code Online (Sandbox Code Playgroud)
要在配置之间切换,您可以为不同的环境设置不同的文件,或者将两个配置放在一个文件中,但用 spring boot 配置文件标签包装。
| 归档时间: |
|
| 查看次数: |
2478 次 |
| 最近记录: |