我正在使用一些会吐出以下日志文件的软件:
{"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数组格式?
谢谢。
答案 0 :(得分:0)
使用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();
}
}