gpt4 book ai didi

logback - 在 SLF4J 中使用 JSON 日志记录时如何包含多个 JSON 字段?

转载 作者:行者123 更新时间:2023-12-05 07:31:15 30 4
gpt4 key购买 nike

我正在使用 Dropwizard 1.3.2,它使用 SLF4J 通过 Logback 进行日志记录。我正在编写用于摄取到 ElasticSearch 的日志,所以我想我会使用 JSON 日志记录并制作一些 Kibana 仪表板。但我真的希望每条日志消息有多个 JSON 项 - 如果我正在记录包含十个字段的状态更新,我希望记录对象并将 JSON 字段显示为 JSON 日志中的顶级条目。我确实让 MDC 工作了,但那非常笨拙并且不会展平对象。

事实证明这很难!我怎样才能做到这一点?我用它记录了 JSON,但我不能很好地记录多个 JSON 字段!

我做过的事情:

我的 Dropwizard 配置有这个附加程序:

  appenders:
- type: console
target: stdout
layout:
type: json
timestampFormat: "ISO_INSTANT"
prettyPrint: false
appendLineSeparator: true
additionalFields:
keyOne: "value one"
keyTwo: "value two"
flattenMdc: true

显示了附加字段,但这些值似乎已固定在配置文件中,不会更改。有一个“customFieldNames”,但没有关于如何使用它的文档,而且无论我在其中输入什么,我都会收到“没有从字符串值反序列化的字符串参数构造函数/工厂方法”错误。 (文档有一个示例值“@timestamp”,但没有解释,甚至会产生错误。他们也有像“(requestTime:request_time,userAgent:user_agent)”这样的示例,但同样,没有记录,我无法做任何事情类似的工作,我尝试过的一切都会产生上述错误。

我确实让 MDC 工作了,但是将每个项目插入 MDC 然后清除它似乎很愚蠢。

我可以反序列化一个对象并将其记录为嵌套的 JSON,但这看起来也很奇怪。

我在这方面看到的所有答案都是旧的 - 有人对如何在 Dropwizard 中很好地做到这一点有任何建议吗?

最佳答案

您可以使用 custom logger factory 在 Dropwizard 中显式使用 logback , 然后用 logstash-logback-encoder 设置它,并将其配置为写出到 JSON appender。

JSON 编码器可能如下所示:

<included>

<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<pattern>
{
"id": "%uniqueId",
"relative_ns": "#asLong{%nanoTime}",
"tse_ms": "#asLong{%tse}",
"start_ms": "#asLong{%startTime}",
"cpu": "%cpu",
"mem": "%mem",
"load": "%loadavg"
}
</pattern>
</pattern>
<timestamp>
<!-- UTC is the best server consistent timezone -->
<timeZone>${encoders.json.timeZone}</timeZone>
<pattern>${encoders.json.timestampPattern}</pattern>
</timestamp>
<version/>
<message/>
<loggerName/>
<threadName/>
<logLevel/>
<logLevelValue/><!-- numeric value is useful for filtering >= -->
<stackHash/>
<mdc/>
<logstashMarkers/>
<arguments/>
<provider class="com.tersesystems.logback.exceptionmapping.json.ExceptionArgumentsProvider">
<fieldName>exception</fieldName>
</provider>

<stackTrace>
<!--
https://github.com/logstash/logstash-logback-encoder#customizing-stack-traces
-->
<throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
<rootCauseFirst>${encoders.json.shortenedThrowableConverter.rootCauseFirst}</rootCauseFirst>
<inlineHash>${encoders.json.shortenedThrowableConverter.inlineHash}</inlineHash>
</throwableConverter>
</stackTrace>
</providers>
</encoder>
</included>

File on Github

并产生这样的输出:

{"id":"FfwJtsNHYSw6O0Qbm7EAAA","relative_ns":20921024,"tse_ms":1584163814965,"start_ms":null,"@timestamp":"2020-03-14T05:30:14.965Z","@version":"1","message":"Creating Pool for datasource 'logging'","logger_name":"play.api.db.HikariCPConnectionPool","thread_name":"play-dev-mode-akka.actor.default-dispatcher-7","level":"INFO","level_value":20000}

关于logback - 在 SLF4J 中使用 JSON 日志记录时如何包含多个 JSON 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51912632/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com