【问题标题】:Logging everything that goes through an InputStream记录通过 InputStream 的所有内容
【发布时间】:2017-08-11 23:28:11
【问题描述】:

我正在使用 Gson 来处理 Json 响应。有时我会遇到异常,但不幸的是我没有足够的上下文来查明问题的确切位置。

JsonReader 创建如下:

private JsonReader getJsonReader(final HttpEntity entity) throws IOException {
    final InputStreamReader reader = new InputStreamReader(entity.getContent(), StandardCharsets.UTF_8);
    return new JsonReader(reader);
}

我的想法是继承 InputStreamReader 并记录通过它的所有内容,以便在引发异常时获得更多上下文。

有没有更好的办法?

【问题讨论】:

  • “更好”是一个非常模糊的术语。我认为您的想法是合理的:应该很容易实现;并且不需要对您的代码库进行任何“戏剧性”的更改。
  • 异常通常应该包含足够的上下文(Jackson 异常在这方面肯定从未让我失望过)。这将取决于我猜的框架。子类化InputStream 或简单地使用调试器应该可以查明问题。
  • 1) JsonReader.toString() 输出当前解析位置。这是一个很好的背景吗? 2) 如果有必要,我会继承JsonReader,而不是InputStreamReaderJsonReader 通过设计剥离冗余令牌。 (假设一个打印/格式化的输入流将记录每个空格,而装饰 JsonReader 将仅记录 JSON 令牌)。
  • @Roland 好吧,这取决于您期望的上下文。 :) 我也想过将Reader 子类化(但实际上不是InputStreamReader 有利于装饰),但是由于您更关注Gson 的东西,我会实现类似JsonReader 的子类的东西最后一个令牌的短队列可能具有它们各自的值。是的,实现起来稍微困难一些,但它肯定会去除空格等。但是,您可能还想跟踪 LoggingReader 中的位置(完全读取的字节),以便更准确地定位无效 JSON。

标签: java json gson inputstream


【解决方案1】:

我创建了以下两个子类:

public class LoggingReader extends InputStreamReader {

    private char[] lastRead;

    public LoggingReader(final InputStream inputStream, final Charset charset) {
        super(inputStream, charset);
    }

    @Override
    public int read(final char[] chars, final int i, final int i1) throws IOException {
        final int result = super.read(chars, i, i1);
        lastRead = chars;
        return result;
    }

    public String getLastRead() {
        return new String(lastRead);
    }
}

public class LoggingJsonReader extends JsonReader {
    private final LoggingReader reader;
    public LoggingJsonReader(final LoggingReader in) {
        super(in);
        this.reader = in;
    }

    public String getLastRead() {
        return reader.getLastRead();
    }
}

现在,当抛出异常时,我会这样做:

catch (Exception ex) {
  if (reader instanceof LoggingJsonReader) {
    LoggingJsonReader lReader = (LoggingJsonReader) reader;
    log.error(lReader.getLastRead());
  }

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 2015-08-23
    • 2019-07-19
    • 1970-01-01
    • 2014-04-30
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多