[英]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.