我正在从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
但一旦它被记录下来。流正在关闭:(
简单的解决方案是编写自己的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,并将其返回给调用者,而不是源inputStream。它做起来更简单,但它是正确的解决方案取决于您的用例。
这是一个非常古老的问题,但现在做这件事的另一个选择是使用log4J IOStreams类。这些可以让你呈现一个流式处理界面,但结果会转到你选择的日志文件中。