Kibana 为什么logback.encoder StructuredArguments不打印日志?

hk8txs48  于 2022-12-09  发布在  Kibana
关注(0)|答案(1)|浏览(177)

依赖关系

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或其他地方是否需要任何其他配置来选择这些日志语句?

l2osamch

l2osamch1#

我似乎已经解决了这个问题。原来你不能像那样打印对象。你必须把它转换成字符串表示,所以下面通过调用对象上的toString()方法解决了我的问题。

log.info("==> Log Sample 2 : {}", keyValue("customObject", customObject.toString()));

一些文章建议,如果您使用LoggingEventCompositeJsonEncoder这样的自定义编码器,则必须在logback.xml中进行如下配置,以便能够拾取StructuredArguments

<providers>
    <arguments>
        <includeNonStructuredArguments>true</includeNonStructuredArguments>. 
        <nonStructuredArgumentsFieldPrefix>prefix </nonStructuredArgumentsFieldPrefix>
    </arguments>
</providers>

但是,如果您正在使用以下任何编码器,则默认情况下,这些编码器生成的AccessEvent的JSON输出中将包含字段,并且您不必进行任何自定义配置。

  • LogstashEncoder
  • LogstashAccessEncoder
  • LogstashAccessLayout,以及
  • logstash访问附加器

来源

相关问题