Log4J2 JSONLAYOUT如何添加自定义参数

时间:2017-11-10 23:37:38

标签: log4j2

如何将自定义参数添加到Log4j2的JSONLAYOUT?

还有一种方法可以将模式添加到JSONLAYOUT的消息元素中吗?

我已尝试过此处列出的选项 - >
logging.apache.org/log4j/2.x/manual/layouts.html#JSONLayout

请帮忙!

2 个答案:

答案 0 :(得分:2)

根据我的理解,您正在寻找一种方法来自定义JSONLayout的JSON输出格式,其方式类似于您可以通过指定&#来自定义PatternLayout的方式34;转换模式"。

我相信答案是您无法以相同的方式自定义JSONLayout。您可以选择要包含在邮件中的各种信息。例如,documentation会显示properties

等参数
  

如果为true,则appender在生成的JSON中包含线程上下文映射。默认为false。

因此,您可以设置各种参数以包含某些类型的信息,但您无法直接控制所包含的特定项目。

可以做的是使用ObjectMessage和JSON库来生成JSON消息。但是,这将在JSON中生成JSON(假设您仍希望使用此方法使用JSONLayout)。以下是一些示例代码:

具有生成日志消息的main方法的类:

package example;

import java.util.HashMap;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.json.JSONObject;

public class JsonMessageExample {

    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args) {
        Map<String,String> msgMap = new HashMap<>();
        msgMap.put("myKey", "myValue");
        JSONObject message = new JSONObject(msgMap);
        log.info(message);
    }
}

log4j2.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <JSONLayout/>
        </Console>

    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

以上的输出:

{
  "timeMillis" : 1510429852038,
  "thread" : "main",
  "level" : "INFO",
  "loggerName" : "example.JsonMessageExample",
  "message" : "{\"myKey\":\"myValue\"}",
  "endOfBatch" : false,
  "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
  "threadId" : 1,
  "threadPriority" : 5
}

如您所见,消息名称值对的值为JSON字符串。为了解析这个,你必须将外部对象解析为JSON,拉出消息字段,然后将其值解析为JSON。

但是,如果您使用其他布局,例如非常基本的PatternLayout,请执行以下操作:<PatternLayout pattern="%m%n"/>

您将只能生成一个级别的JSON输出,因此只需解析一次。但是,您必须编写逻辑以获取消息中所需的所有数据并将其填充到地图(和JSON对象)中,因为现在您只是转储地图的内容。

使用相同的java代码输出示例,布局更改为PatternLayout,如上所述:

{"myKey":"myValue"}

修改

如果您想使用&#34;转换模式&#34;您甚至可以执行以下操作。 PatternLayout的输出,以JSON格式输出日志,而不必编写逻辑来获取某些细节:

<PatternLayout pattern="{&quot;timeMillis&quot;:&quot;%d{UNIX_MILLIS}&quot;,&quot;thread&quot;:&quot;%t&quot;,&quot;level&quot;:&quot;%p&quot;,&quot;loggerName&quot;:&quot;%c&quot;,&quot;message&quot;:%m}%n"/>

示例输出:

{&#34; timeMillis&#34;:&#34; 1510455694601&#34;&#34;螺纹&#34;:&#34;主&#34;&#34;电平&#34;:& #34; INFO&#34;&#34; loggerName&#34;:&#34; example.JsonMessageExample&#34;&#34;消息&#34; {&#34;的myKey&#34;:&#34 ; myvalue的&#34;}}

答案 1 :(得分:2)

解决方案是明确添加log4j2的2.10.0版本。此版本支持JSONLayout中的自定义参数!

<Appenders>

    <Console name="Console" target="SYSTEM_OUT">
        <JSONLayout compact="true" eventEol="true">
            <KeyValuePair key="application" value="${sys:com.example.appname}"/>
        </JSONLayout>
    </Console>
    <Async name="AsyncAppender" bufferSize="80">
        <AppenderRef ref="Console"/>
    </Async>

</Appenders>