【发布时间】:2018-09-15 08:39:48
【问题描述】:
我正在使用一些会输出到以下日志文件的软件:
{"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 数组格式输出?
谢谢。
【问题讨论】:
-
尝试使用
@SerializedName而不是@JsonProperty -
一个有效的 JSON 数组如下所示:[{...}, {...}]。
-
是的,您知道如何使记录器以数组格式输出吗?那应该很容易,我似乎无法弄清楚
-
使用 Gson JsonStreamParser 解析器解决了它,我会尽可能更新答案。谢谢
标签: java json logstash logback