Log4J2 JSONLAYOUT如何添加自定义参数

问题描述:

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

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

我试图在这里列出的选项 - >
logging.apache.org/log4j/2.x/manual/layouts.html#JSONLayout

请帮帮忙!

+0

https://logging.apache.org/log4j/2.x/manual/layouts.html#JSONLayout –

+0

@DB谢谢。我已经检查了正确的链接,并没有找到如何添加自定义参数。问题是关于添加自定义参数,这在该链接中未提及。 – TuneIt

+0

您能否通过添加自定义参数来澄清您的意思? –

据我所知,您正在寻找一种方法来定制JSONLayout的JSON输出格式,方式类似于您可以通过指定“转换模式”来自定义PatternLayout

我相信答案是你不能以相同的方式定制JSONLayout。您可以可以选择您想要包含在邮件中的各种信息。例如,示出了documentationproperties参数:

如果为真,在附加器包括在所生成的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="{&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"/>

示例输出:

{ “timeMillis”: “1510455694601”, “线程”: “主”, “水平”: “信息”, “loggerName”: “example.JsonMessageExample”,”消息“:{”myKey“:”myValue“}}

+0

感谢您的建议。有没有其他方法可以将自定义参数添加到“JSONLayout”中? – TuneIt

+1

您可以编写自己的布局 –

+0

@ D.B。如何编写自定义布局? –