Log4J2 JSONLAYOUT如何添加自定义参数
如何将自定义参数添加到Log4j2的JSONLAYOUT?Log4J2 JSONLAYOUT如何添加自定义参数
还有一种方法可以将模式添加到JSONLAYOUT的消息元素?
我试图在这里列出的选项 - >
logging.apache.org/log4j/2.x/manual/layouts.html#JSONLayout
请帮帮忙!
据我所知,您正在寻找一种方法来定制JSONLayout
的JSON输出格式,方式类似于您可以通过指定“转换模式”来自定义PatternLayout
。
我相信答案是你不能以相同的方式定制JSONLayout
。您可以可以选择您想要包含在邮件中的各种信息。例如,示出了documentation等properties
参数:
如果为真,在附加器包括在所生成的JSON线程上下文映射。默认为false。
因此,您可以设置各种参数以包含某些类型的信息,但是您不能直接控制包含的特定项目。
你可能做的是使用ObjectMessage
以及JSON库来生成JSON消息。但是,这会在JSON中生成JSON(假设您仍然希望使用JSONLayout
这种方法)。下面是一些示例代码来说明:
一类与主方法,以产生一个日志消息:
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"}
编辑:
,如果你想用你甚至可以这样做以下PatternLayout
的“转换模式”,以JSON格式输出日志,而不必编写逻辑来获取一些具体信息:
<PatternLayout pattern="{"timeMillis":"%d{UNIX_MILLIS}","thread":"%t","level":"%p","loggerName":"%c","message":%m}%n"/>
示例输出:
{ “timeMillis”: “1510455694601”, “线程”: “主”, “水平”: “信息”, “loggerName”: “example.JsonMessageExample”,”消息“:{”myKey“:”myValue“}}
https://logging.apache.org/log4j/2.x/manual/layouts.html#JSONLayout –
@DB谢谢。我已经检查了正确的链接,并没有找到如何添加自定义参数。问题是关于添加自定义参数,这在该链接中未提及。 – TuneIt
您能否通过添加自定义参数来澄清您的意思? –