依赖性
implementation("net.logstash.logback:logstash-logback-encoder:${version}")代码样本
import static net.logstash.logback.argument.StructuredArguments.keyValue;
@Component
@Slf4j
public class TestClass {
public void testLogging() {
CustomObject customObject = new CustomObject(...);
log.info("==> Log Sample 1 : customObject {}", customObject);
log.info("==> Log Sample 2 : {}", keyValue("customObject", customObject));
}
//calling testLogging method in main method
}logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<appender name="jsonConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<timestampPattern>MM-dd'T'HH:mm:ss.SSS</timestampPattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="jsonConsoleAppender"/>
</root>
</configuration>实际输出
第一条日志被打印到控制台,而第二条没有。
预期产出
据这篇文章说,“ 导入静态net.logstash.logback.argument.StructuredArguments.keyValue;字符串orderId = "123";log.info(“orderId {}",keyValue("orderId",orderId));
orderId作为单独的字段添加到消息(通过{}-placeholder)和JSON输出中。这可以在Kibana搜索和显示。
但是,使用keyValue(),log语句不是
在logback.xml或其他地方是否需要进行任何额外的配置来选择这类日志语句?
发布于 2022-07-26 21:48:11
我好像修好了。原来你不能像那样打印物体。您必须将其转换为字符串表示,因此下面通过调用对象上的toString()方法解决了我的问题。
log.info("==> Log Sample 2 : {}", keyValue("customObject", customObject.toString()));一些文章建议,如果您使用像LoggingEventCompositeJsonEncoder这样的自定义编码器,您必须在logback.xml中添加一些配置,如下面这样的配置,以便能够选择StructuredArguments。
<providers>
<arguments>
<includeNonStructuredArguments>true</includeNonStructuredArguments>.
<nonStructuredArgumentsFieldPrefix>prefix </nonStructuredArgumentsFieldPrefix>
</arguments>
</providers>但是,如果您使用以下任何一个编码器,那么对于这些代码生成的AccessEvents,默认情况下将在JSON输出中包含字段,并且您不必执行任何自定义配置。
LogstashEncoderLogstashAccessEncoderLogstashAccessLayout,和https://stackoverflow.com/questions/73127374
复制相似问题