首页 > 解决方案 > 在 JSON 布局中使用自定义参数 [Log4j 2]

问题描述

我对 Log4j 2 中属性替换、查找和布局参数的含义感到困惑。文档提到JSON 布局支持自定义字段。但是,它似乎不支持 %d{ISO8601}、%m、%l 等转换模式。但是它确实支持查找。

因此,当我在 xml 中定义时:

            <JsonLayout complete="false" compact="false">
                <KeyValuePair key="@timestamp" value="%d{ISO8601}" />
                <KeyValuePair key="message" value="%message" />
                <KeyValuePair key="process.thread.name" value="%tn" />
            </JsonLayout >

作为输出,我只是得到 strings %d{ISO8601}, %message... 而不是值。

我想要实现的是一个 JSON 布局,我可以在其中包含类似于 Pattern Layout 的参数,我只需编写<pattern>%d %p %C{1.} [%t] %m%n</pattern>它以获得我想要的东西。或者,或者,我应该使用 Pattern 布局并将 JSON 格式的字符串拼接在一起,利用 Pattern Layout 的 JSON 编码%enc{%m}{JSON}

标签: log4jlog4j2

解决方案


GelfLayout 当前支持 messagePattern 属性,该属性将使用 patternLayout 仅格式化 JSON 中的消息字段。我也计划将它添加到 JSONLayout 中,但还没有完成。有一个新的 JsonTemplateLayout 处于合并到 Log4j 2 的最后阶段,它也将支持这一点。您可以从当前的拉取请求中获取布局,也可以等待 Log4j 2.14.0 版本,因为这两个选项可能都可用。


推荐阅读