首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么logback.encoder StructuredArguments不打印日志?

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

Stack Overflow用户
提问于 2022-07-26 17:17:50
回答 1查看 164关注 0票数 0

依赖性

代码语言:javascript
复制
implementation("net.logstash.logback:logstash-logback-encoder:${version}")

代码样本

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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语句不是

  • 登录到控制台(完全被忽略)
  • 在kibana中没有将customObject作为单独的筛选字段列出

在logback.xml或其他地方是否需要进行任何额外的配置来选择这类日志语句?

EN

回答 1

Stack Overflow用户

发布于 2022-07-26 21:48:11

我好像修好了。原来你不能像那样打印物体。您必须将其转换为字符串表示,因此下面通过调用对象上的toString()方法解决了我的问题。

代码语言:javascript
复制
log.info("==> Log Sample 2 : {}", keyValue("customObject", customObject.toString()));

一些文章建议,如果您使用像LoggingEventCompositeJsonEncoder这样的自定义编码器,您必须在logback.xml中添加一些配置,如下面这样的配置,以便能够选择StructuredArguments

代码语言:javascript
复制
<providers>
    <arguments>
        <includeNonStructuredArguments>true</includeNonStructuredArguments>. 
        <nonStructuredArgumentsFieldPrefix>prefix </nonStructuredArgumentsFieldPrefix>
    </arguments>
</providers>

但是,如果您使用以下任何一个编码器,那么对于这些代码生成的AccessEvents,默认情况下将在JSON输出中包含字段,并且您不必执行任何自定义配置。

  • LogstashEncoder
  • LogstashAccessEncoder
  • LogstashAccessLayout,和
  • logstash访问附加程序

来源

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73127374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档