记录通过 InputStream 的所有内容

Logging everything that goes through an InputStream

我正在使用 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 并记录所有经过它的内容,以便在抛出异常时有更多上下文。

有没有更好的方法?

我创建了以下两个子类:

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());
  }