使用log4j记录流数据

时间:2012-09-11 05:01:11

标签: java logging stream log4j

我从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));

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

的LogOutputStreamUtil

但是一旦记录下来。溪流正在关闭:(

2 个答案:

答案 0 :(得分: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
}

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

还有其他方法可以实现这一点,例如将source inputStream复制到缓冲区(bytearray,字符串或任何适合您的方式),记录该缓冲区,并在缓冲区周围创建另一个inputStream并将其返回给调用者而不是源inputStream。它更简单,但是正确的解决方案取决于您的用例。

答案 1 :(得分:0)

这是一个非常老的问题,但是如今,执行此操作的另一种选择是使用log4J IOStreams类。这些使您可以呈现一个Streaming界面,但是将结果保存到您选择的日志文件中。