簡體   English   中英

Log4j2 JSON布局:處理“ \\ n”(換行符)

[英]Log4j2 JSON layout: handling of “\n” (new line character)

我正在使用Log4j2及其JSONLayout來生成JSON格式的日志。 一切正常,但是當我使用Logger.warn(String message, Throwable t)如下所示:

l4j2Logger.warn("log1...\n...log2", new Exception("ex1...\n...ex2"));

我進入日志:

"message":"log1...\n...log2",
"throwable":"java.lang.Exception: ex1...\\n...ex2\\n\tat test.Test.log(Test.java:73)\\n\tat......"

message密鑰中, \\n字符寫入\\n在日志文件中,
但是在throwable鍵中, \\n字符被寫入\\\\n在日志文件中。

由於我需要解析這些日志,因此JSON解析器不喜歡\\\\n ,這似乎很正常,因為JSON規范指示應使用\\n

這是我的log4j XML配置文件的摘錄:

<Appenders>
    <File name="FileAppender" fileName="log4j2.log" append="true">
        <JSONLayout complete="true" compact="false"/>
    </File>
</Appenders>

您知道Log4j2為什么在throwable使用\\\\n以及是否/如何更改它嗎? (我正在使用最新的Log4j-2.0-RC1)

首先,請謹慎解釋日志文件。 無論打印什么日志文件,都可能會插入轉義序列。

在解析JSON文檔中的字符串時,\\ n將被換行符替換。 \\ n是完全合法的:\\字符將被替換為單個\\,然后您只有一個普通的n。 因此,您將獲得一個包含反斜杠字符的字符串,然后是解析器傳遞的n個字符,而不是帶有換行符的字符串。 解析器應該沒有任何問題。

在l4j2Logger.warn中,使用兩個包含換行符的字符串。 在JSON文檔中,“ message”似乎具有表示第一個參數的字符串值。 “ throwable”值似乎具有一個表示源代碼的字符串值。 您的日志文件中的行是:

"throwable":"java.lang.Exception: ex1...\\n...ex2\\n\tat test.Test.log(Test.java:73)\\n\tat......"

這將被解析為字符串

java.lang.Exception: ex1...\n...ex2\n  at test.Test.log(Test.java:73)\n  at......"

我將檢查哪些工具讀取了這些日志文件。 這似乎是有意的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM