我使用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,这是目前最新的)
答案 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......"
我检查哪些工具读取这些日志文件;这似乎是有意的。