如何将此 json 日志输出解析为我的 Bean 列表?



我正在使用一些软件,这些软件会吐出以下日志文件:

{"message":"logger controller initialised","@timestamp":"2018-09-15T09:33:25.709+01:00","logger_name":"com.hidden.controller.LoggerController","thread_name":"JavaFX Application Thread","level":"DEBUG"}
{"message":"parsing history log data to display","@timestamp":"2018-09-15T09:33:25.877+01:00","logger_name":"com.hidden.controller.LoggerController","thread_name":"JavaFX Application Thread","level":"DEBUG"}

当我尝试使用 Gson 将这个 json 文件解析为 LogRowModel[] 时,它会在 json 的格式周围吐出各种错误,例如:

Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

我使用以下设置使用logback/logstash json编码器写入文件:

<configuration>
<timestamp key="time" datePattern="yyyy-MM-dd'_'HH-mm-ss.SSS"/>
<appender name="RootSiftAppender" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<Key>test</Key>
<DefaultValue>logfile</DefaultValue>
</discriminator>
<sift>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>src\main\resources\${test}.json</File>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<message/>
<timestamp/>
<loggerName/>
<threadName/>
<logLevel/>
</providers>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>${test_name}.%i.json</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>100</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>50MB</MaxFileSize>
</triggeringPolicy>
</appender>
</sift>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%n %d{HH:mm:ss} %thread %level %logger{0} %msg</pattern>
</encoder>
</appender>
<root level="RootSiftAppender">
<appender-ref ref="RootSiftAppender"/>
</root>
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
</root>
</configuration>

如何将我的 json 文件解析为以下数组:

@Data
@Slf4j
public class LogRowModel {
@JsonProperty("@timestamp") private final String timestamp;
@JsonProperty("message") private final String message;
@JsonProperty("logger_name") private final String logger;
@JsonProperty("level") private final String level;
@JsonProperty("thread_name") private final String thread;
}

这是我当前的代码,它抛出了错误(我认为错误在于 json 格式,对如何更好地格式化它挠头(

Type collectionType = new TypeToken<Collection<LogRowModel>>(){}.getType();
Collection<LogRowModel> enums = new Gson().fromJson(new FileReader(new File("src/main/resources/logfile.json")), collectionType);

或者如何使我的记录器输出为更好的 JSON 数组格式?

谢谢。

示例代码,说明我如何使用 Gson 的 JsonStreamParser 依次处理每个根节点对象来实现我需要的东西。

private void buildHistoryData() {
if (isLogFileEmpty()) return;
history.clear();
Gson gson = new GsonBuilder().create();
try {
JsonStreamParser parser = new JsonStreamParser(new FileReader(LOG_FILE));
while (parser.hasNext()) {
final LogRowModel currentRow = gson.fromJson(parser.next(), LogRowModel.class);
if (currentFilter == LogFilter.ALL) history.add(currentRow);
else if (currentRow.getLevel().equalsIgnoreCase(currentFilter.getLevel()))
history.add(currentRow);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

最新更新