依赖关系
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>
[实际输出]
第一个日志被打印到控制台,但第二个没有。
[预期输出]
根据这篇文章,“
import static net.logstash.logback.argument.StructuredArguments.keyValue;
String orderId = "123";
log.info("Order saved {}", keyValue("orderId", orderId));
orderId
既被添加到消息中(通过{}-占位符),又作为一个单独的字段添加到JSON输出中。
但是,使用keyValue()
时,log语句不会
- 记录到控制台(完全忽略)
- customObject未在Kibana UI中作为单独的筛选器字段列出
在logback.xml或其他地方是否需要任何其他配置来选择这些日志语句?
1条答案
按热度按时间l2osamch1#
我似乎已经解决了这个问题。原来你不能像那样打印对象。你必须把它转换成字符串表示,所以下面通过调用对象上的
toString()
方法解决了我的问题。一些文章建议,如果您使用
LoggingEventCompositeJsonEncoder
这样的自定义编码器,则必须在logback.xml
中进行如下配置,以便能够拾取StructuredArguments
。但是,如果您正在使用以下任何编码器,则默认情况下,这些编码器生成的AccessEvent的JSON输出中将包含字段,并且您不必进行任何自定义配置。
LogstashEncoder
LogstashAccessEncoder
LogstashAccessLayout
,以及来源