从 Log4J2 JsonTemplateLayout 输出中排除空字段

Exclude empty fields from Log4J2 JsonTemplateLayout output

log4j2 PatternLayout 提供了一个 %notEmpty 转换模式,允许您跳过引用空变量的模式部分。

有什么方法可以为 JsonTemplateLayout, specifically for thread context data (MDC) 做类似的事情吗?它正确地 (IMO) 抑制了空字段,但它对空字段没有同样的效果。

例如,在我的 JSON 模板中给出以下内容:

"application": {
  "name":     { "key": "x-app", "$resolver": "mdc" },
  "context":  { "key": "x-app-context", "$resolver": "mdc" },
  "instance": {
    "name":    { "key": "x-appinst", "$resolver": "mdc" },
    "context": { "key": "x-appinst-context", "$resolver": "mdc" }
  }
}

有没有办法防止像这样的块被记录,其中子树中的唯一数据是 context 的空字符串值?

"application":{"context":"","instance":{"context":""}}

(是的,理想情况下,我会首先阻止将这些空字符串放入上下文中,但这不是我的应用程序,我只是在配置它。)

据我所知,不。我建议您创建一个 Jira 问题来解决这个问题。

JsonTemplateLayout作者在这里发言。目前,JsonTemplateLayout 不支持 空白 属性 排除 ,原因如下:

  1. empty/blank 的定义不明确。可能有 null{}"\s*"[][[]][{}] 等作为有效的 JSON 值.以下哪一项是 empty/blank?让我们假设我们已经就某种行为达成一致。它会适用于其他用户吗?
  2. 检查值是否为 empty/blank 会产生额外的运行时成本。
  3. 大多数时候你不在乎。您将日志保存在存储系统中,例如 ELK 堆栈,并且存储引擎以最有效的方式提供开箱即用的空白值消除。

您介意分享您的用例吗? 为什么要 阻止 "context": "" 属性的发射?如果您将日志传送到 Elasticsearch,您可以通过适当的索引映射轻松地排除这些字段。