1

我有这种模式布局的 log4j2-spirng.xml

<PatternLayout alwaysWriteExceptions="false"      
 pattern={... &quot;userId&quot;:&quot;%X{userId}&quot;} ..." />

userId 是来自 MDC 的值。如果它为空,则使用如下空白值记录:

..., "userId": "", ...

现在我正在尝试使用 JsonTemplateLayout 将所有字段从模式布局移动到 Json 模板。

在日志模板中,我正在尝试构建相同的日志消息。时间戳和其他字段都很好,没有问题。唯一的问题是 mdc 值。当值存在时,这些值被正确记录,但当不存在时,字段将被忽略并且不包含在日志中。像这样从 mdc 读取值

...
  "userId": {
    "$resolver": "mdc",
    "key": "userId"
  },
...

我应该应用格式并将这个“%X”放在某个地方还是它是如何工作的?我必须从模式布局中获取与所有字段相同的日志,并且如果字段在 MDC 中不存在或为空或为空,则仍将其仅包含在日志中,并带有空字符串值。

4

1 回答 1

0

这是ThreadContextDataResolver(aka mdc) 应该工作的方式:如果给定的线程上下文键不存在,则省略 JSON 属性。

如果要包含这些属性,即使它们是空的,也可以使用PatternResolver

"userId": {
  "$resolver": "pattern",
  "pattern": "%X{userId}"
}
于 2022-01-06T23:57:14.237 回答