Log4j2 JsonTemplateLayout - 将消息字段记录为 json

问题描述 投票:0回答:3
log4j2
3个回答
3
投票

进一步阅读 JSON 模板布局文档后,您可以利用

eventTemplateAdditionalField
参数修改事件模板字段。

似乎有几种方法可以解决此问题,但我选择的选项是修改

log4j2.xml
:

<Appenders>
        <Console name="JsonAppender" target="SYSTEM_OUT">
            <JsonTemplateLayout eventTemplateUri="classpath:LambdaEcsLayout.json">
                <EventTemplateAdditionalField
                        key="message"
                        format="JSON"
                        value='{"$resolver": "message", "field": "name"}'/>/>
            </JsonTemplateLayout>

        </Console>
    </Appenders>

登录时,有这样的内容:

var logMap = new HashMap<>();
        logMap.put("id", "123456789");
        logMap.put("action", "Received request");
        var om = new ObjectMessage(logMap);

        log.info(om);

可能有一种更简洁的方法来处理后者,某种包装器等 - 但你明白了。


0
投票

我能够让@Hurricane的方法起作用,但在尝试简化它时,我发现你可以省略 元素并添加

"message": {
    "$resolver": "message",
    "stringified": false
}

改为模板布局。您还可以省略“stringified”属性,因为它默认为“false”。 OP 不包括布局,但我怀疑他已将“stringified”设置为“true”


0
投票

我和Alan有同样的问题,有解决办法吗?

嗯,经过审查,这对我不起作用。它对我来说不适用于某些任意对象,例如我得到 "message":{"x":{"a":"b"},"p":"com.xyz.Person@3132fc"} x 是一张地图,很好。 p 是一个 bean,是错误的,但可以使用 jsonLayout 来工作文件。为什么这一切如此困难?这太荒谬了。 – 艾伦·海伊 2023 年 10 月 26 日 16:27

© www.soinside.com 2019 - 2024. All rights reserved.