JSONLayout 时将 json 对象添加到 log4j2

Jeu*_*eus 5 java json log4j2

我会告诉log4j2与JSONLayout相同的消息对象。例如我的配置是:

猫 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <File name="Json" fileName="/home/jeus/log/loggerjson/main.log" bufferedIO="true" advertiseURI="file://home/jeus/log/loggerjson/main1.log" advertise="true">
        <JSONLayout compact="true" locationInfo="true" complete="false" eventEol="true" properties="true" propertiesAsList="true"/>
    </File>       
</Appenders>
<Loggers>
    <Root level="info">
        <AppenderRef ref="Json"/>
    </Root>
</Loggers>
Run Code Online (Sandbox Code Playgroud)

我的输出输出:

cat /home/jeus/log/loggerjson/main.log

{
 "timeMillis":1502359773290,
 "thread":"main",
 "level":"INFO",
 "loggerName":"com.jeus.logger.json.loggerjson.Main",
 "message":"This message is a raw",
 "endOfBatch":false,
 "loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger",
 "contextMap":[  ],
 "threadId":1,
 "threadPriority":5,
 "source":{  
     "class":"com.jeus.logger.json.loggerjson.Main",
     "method":"main",
     "file":"Main.java",
     "line":61
      }
}
Run Code Online (Sandbox Code Playgroud)

我添加了一个 json 对象来记录,但没有在消息中显示 json 对象,并用\"字符显示

JSON 对象:

{"line_id": 12,"play_name":"Jeus"}
Run Code Online (Sandbox Code Playgroud)

我要记录的代码:

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

public class Main {

       private static final Logger LOGGER = LogManager.getLogger(Main.class);

       public static void main(String[] args) {


            String message = "{\"line_id\": 12,\"play_name\": \"Jeus\"}";
            LOGGER.info(message);

        }
 }
Run Code Online (Sandbox Code Playgroud)

输出是:

{  
 "timeMillis":1502361394238,
 "thread":"main",
 "level":"INFO",
 "loggerName":"com.jeus.logger.json.loggerjson.Main",
 "message":"{\"line_id\": 12,\"play_name\": \"Jeus\"}",
 "endOfBatch":false,
 "loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger",
 "contextMap":[  

 ],
 "threadId":1,
 "threadPriority":5,
 "source":{  
    "class":"com.jeus.logger.json.loggerjson.Main",
    "method":"main",
    "file":"Main.java",
    "line":62
    }
 }
Run Code Online (Sandbox Code Playgroud)

但我会将消息显示为与此相同的 json 对象:

 "message":{"line_id": 12,"play_name":"Jeus"},
Run Code Online (Sandbox Code Playgroud)

Spe*_*ton 1

使用内置 JsonLayout 似乎不可能做到这一点。无论我尝试什么,它都只是在字段上执行 toString 而不是正确序列化它。

一种解决方案是使用 PatternLayout 并将其格式化为 JSON。

log4j.appender.frontEndAudit.layout=org.apache.log4j.PatternLayout
log4j.appender.frontEndAudit.layout.ConversionPattern={"timestamp": 
"%d{MM/dd/yyyy HH:mm:ss:SSSS}", "class": "%C", "file": "%F", "level" : 
"%5p", "line_number" : "%L", "logger_name": "frontEndAuditLog", "mdc": 
"ipAddress": "%X{ipAddress}", "requestId":"%X{requestId}", 
"sessionId":"%X{sessionId}"}, "message": %m, "method": "%M", 
"source_host":"%X{sourceHost}", "thread_name": "%t" }%n
Run Code Online (Sandbox Code Playgroud)

这是针对 log4j1 的,但同样的概念也适用于 log4j2