gpt4 book ai didi

java - Log4J - JsonLayout 和 RollingFileAppender 生成无效的 JSON

转载 作者:行者123 更新时间:2023-12-01 09:38:30 24 4
gpt4 key购买 nike

我正在尝试使用 Log4J (2.6.2) 将日志存储在 JSON 文件中。我在 RollingFileAppender 中使用 JsonLayout,只要我不尝试附加到之前已写入的文件,它就可以正常工作。

这是我设置布局和附加器的代码:

Layout<?> layout = JsonLayout.createLayout(config, false, false, false, true, false, true, "[", "]", Charset.defaultCharset());

String appenderFileName = "mylogfile-latest.log.json";
String appenderFilePattern = "mylogfile-%i.log.json";
String appenderName = "MyAppender";
Appender appender = RollingFileAppender.createAppender(appenderFileName, appenderFilePattern, "true", appenderName, "true", "256", "true",
SizeBasedTriggeringPolicy.createPolicy(this.configuration.getLogMaxSize().toString()),
null, layout, null, "false", "false", null, config);

正如我所说,我第一次在日志文件中写入时它工作正常:

[
{
"timeMillis" : 1469620840442,
"thread" : "SimpleAsyncTaskExecutor-43",
"level" : "ERROR",
"loggerName" : "MyLogger",
"message" : "my log message",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"threadId" : 243,
"threadPriority" : 5
}
, {
"timeMillis" : 1469620840442,
"thread" : "SimpleAsyncTaskExecutor-43",
"level" : "DEBUG",
"loggerName" : "MyLogger",
"message" : "my log message",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"threadId" : 243,
"threadPriority" : 5
}
]

然后我关闭我的附加程序等......并重新启动我的应用程序,当我将新日志写入这个现有文件时,这就是我得到的:

[
{
"timeMillis" : 1469620840442,
"thread" : "SimpleAsyncTaskExecutor-43",
"level" : "ERROR",
"loggerName" : "MyLogger",
"message" : "my log message",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"threadId" : 243,
"threadPriority" : 5
}
, {
"timeMillis" : 1469620840442,
"thread" : "SimpleAsyncTaskExecutor-43",
"level" : "DEBUG",
"loggerName" : "MyLogger",
"message" : "my log message",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"threadId" : 243,
"threadPriority" : 5
}

]
{
"timeMillis" : 1469620840490,
"thread" : "SimpleAsyncTaskExecutor-43",
"level" : "ERROR",
"loggerName" : "MyLogger",
"message" : "my log message",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"threadId" : 245,
"threadPriority" : 5
}
, {
"timeMillis" : 1469620840492,
"thread" : "SimpleAsyncTaskExecutor-43",
"level" : "DEBUG",
"loggerName" : "MyLogger",
"message" : "my log message",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"threadId" : 245,
"threadPriority" : 5
}

]

此问题导致无法解析日志,因为 Gson 将无法从此文件创建 List

您是否知道如何解决此问题,而无需进行糟糕的修改,删除多余的 ] 并将其替换为逗号?

谢谢!

最佳答案

JSONLayout 这样做的原因是为了创建一个“格式良好”的 JSON 文档。您需要将每个文档放入其自己的文件中(带有开始和结束括号)才能实现这一点,但此处的情况并非如此。

您有两个选择:

  1. 对于 JSONLayout,设置complete=false(在示例中将其设置为true),这将打印出不带“[”和“]”的内容。然后,您可以在调用 GSON 之前自行添加这些字符(因为该文件实际上不会有数组)。
  2. 使用 org.json:json 或 GS​​ON 等简单内容创建您自己的 JSONLayout(您需要扩展 AbstractStringLayout)来获取文件的字符串。

关于java - Log4J - JsonLayout 和 RollingFileAppender 生成无效的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38636521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com