2017-08-10 111 views
1

我將顯示log4j2與JSONLayout相同的消息上的對象。 例如我的配置是:當JSONLayout添加json對象到log4j2時

貓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> 

我出去把輸出:

貓的/ home/JEUS /日誌/ 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 
     } 
} 

我添加了一個JSON對象登錄,但不顯示在消息中的JSON對象,並表明,\」性格特徵

JSON對象:

{"line_id": 12,"play_name":"Jeus"} 

我的日誌代碼:

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); 

     } 
} 

輸出爲:

{ 
"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 
    } 
} 

,但我會顯示消息作爲一個JSON對象相同的:

"message":{"line_id": 12,"play_name":"Jeus"}, 
+0

可能有辦法做到這一點,不知道。請在log4j用戶郵件列表上詢問完整的Log4j2社區的輸入信息。 –

+0

我認爲它會在「(雙引號)之前顯示\(反斜槓),否則,生成的日誌文件將不會是有效的JSON文件。 –

+0

另一個原因是log4j使用Jackson以JSON格式記錄日誌消息,如果你寫json輸出流中的字符串,反斜槓將在那裏以雙引號標記。 –

回答

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 

這對log4j1但相同的概念將工作log4j2