【问题标题】:How can I parse this json log output into a list of my bean?如何将此 json 日志输出解析为我的 bean 列表?
【发布时间】: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


【解决方案1】:

我如何使用 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();
  }
}

【讨论】:

    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2014-03-08
    相关资源
    最近更新 更多