从 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
不支持 空白 属性 排除 ,原因如下:
- empty/blank 的定义不明确。可能有
null
、{}
、"\s*"
、[]
、[[]]
、[{}]
等作为有效的 JSON 值.以下哪一项是 empty/blank?让我们假设我们已经就某种行为达成一致。它会适用于其他用户吗?
- 检查值是否为 empty/blank 会产生额外的运行时成本。
- 大多数时候你不在乎。您将日志保存在存储系统中,例如 ELK 堆栈,并且存储引擎以最有效的方式提供开箱即用的空白值消除。
您介意分享您的用例吗? 为什么要 阻止 "context": ""
属性的发射?如果您将日志传送到 Elasticsearch,您可以通过适当的索引映射轻松地排除这些字段。
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
不支持 空白 属性 排除 ,原因如下:
- empty/blank 的定义不明确。可能有
null
、{}
、"\s*"
、[]
、[[]]
、[{}]
等作为有效的 JSON 值.以下哪一项是 empty/blank?让我们假设我们已经就某种行为达成一致。它会适用于其他用户吗? - 检查值是否为 empty/blank 会产生额外的运行时成本。
- 大多数时候你不在乎。您将日志保存在存储系统中,例如 ELK 堆栈,并且存储引擎以最有效的方式提供开箱即用的空白值消除。
您介意分享您的用例吗? 为什么要 阻止 "context": ""
属性的发射?如果您将日志传送到 Elasticsearch,您可以通过适当的索引映射轻松地排除这些字段。