0

我正在从 http 连接获取流数据。我想使用 log4j 将流记录到日志文件中。

我需要这个流进一步做一些其他的操作(必须保留)

我怎样才能做到这一点?

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "application/xml");
InputStream xml = connection.getInputStream();

我试过这个:

StreamUtils.copy(xml, new LogOutputStreamUtil(log, Level.INFO));

其中 LogOutputStreamUtil 来自http://www.java2s.com/Open-Source/Java/Testing/jacareto/jacareto/toolkit/log4j/LogOutputStream.java.htm

但是一旦它被记录下来。流即将关闭:(

4

2 回答 2

2

简单的解决方案是编写自己的 inputStream 包装器

就像是:

class LogingInputStream extends BufferedStream {
    ByteArrayOutputStream copy4log = new ByteArrayOutputStream();
    InputStream source;

    public LogingInputStream( InputStream source ) { this.source = source; }

    public int read() {
        int value = source.read()
        logCopy.write( value );
        return value;
    }

    public void close() {
        source.close();
        StreamUtils.copy(xml, new LogOutputStreamUtil(copy4log, Level.INFO));
        copy4log.close();
    }

    .....more code here
}

无论如何,一般的想法是您需要拦截输入流读取方法。

还有其他方法可以完成此操作,例如将源 inputStream 复制到缓冲区(字节数组、字符串或任何适合您的东西),记录该缓冲区,并在缓冲区周围创建另一个 inputStream 并将其返回给调用者而不是源 inputStream。这样做更简单,但它是否正确的解决方案取决于您的用例。

于 2012-09-11T06:44:46.243 回答
0

这是一个非常古老的问题,但是现在这样做的另一个选择是使用log4J IOStreams类。这些允许您呈现流式接口,但将结果转到您选择的日志文件。

于 2019-12-11T23:17:42.970 回答