Log4j2 JSON布局:处理" \ n" (新行字符)

时间:2014-04-17 20:33:39

标签: java json log4j2

我使用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 specifications表示应该使用\n

以下是我的log4j XML配置文件的摘录:

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

你知道为什么Log4j2在\\n中使用throwable,以及是否/如何改变它? (我使用Log4j-2.0-RC1,这是目前最新的)

1 个答案:

答案 0 :(得分:-1)

首先,要小心解释日志文件。无论打印什么日志文件都可能插入转义序列。

在解析JSON文档中的字符串时,\ n将替换为换行符。 \ n是完全合法的:\ \字符将替换为单个\,然后你只有一个普通的n。因此,不是带换行符的字符串,而是获得一个带有反斜杠字符的字符串,后跟解析器传递的n字符。解析器不应该有任何问题。

在l4j2Logger.warn中,使用两个包含换行符的字符串。似乎在JSON文档中,&#34; message&#34;有一个表示第一个参数的字符串值。 &#34; throwable&#34; value似乎有一个表示源代码的字符串值。日志文件中的行是:

"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......"

我检查哪些工具读取这些日志文件;这似乎是有意的。