2

我有一个自定义记录器,我想将控制台中的所有 sysout 和 syserr 重定向到该自定义记录器。所以我想通过以下方式重定向 sysout 和 syserr:

  • 通过扩展 ByteArrayOutputStream
  • 然后设置 System.setErr 和 System.setOut

    public class ServerLoggingPrintStream extends ByteArrayOutputStream  {
        public ServerLoggingPrintStream() {
            super();
        }
    
    public void write(byte[] originalBytes, int originalOffset, int originalLength) {
        synchronized(this) {
            String str = new String(originalBytes);
            if (str.length() == 0 || str.equals(System.getProperty("line.separator")) ) {
                        return;
            } 
    
            //using my custom logger named TRACE_LOGGER
            TRACE_LOGGER.log(LogLevel.INFO, this, "write", str);            
        }
      }
    }
    
    
    ServerLoggingPrintStream  serverLoggingPrintStreamStdOut_ = null;
    ServerLoggingPrintStream  serverLoggingPrintStreamStdErr_ = null;
    
    serverLoggingPrintStreamStdErr_ = new ServerLoggingPrintStream();
    System.setErr(new PrintStream(serverLoggingPrintStreamStdErr_));
    
    serverLoggingPrintStreamStdOut_ = new ServerLoggingPrintStream();
    System.setOut(new PrintStream(serverLoggingPrintStreamStdOut_));
    

你认为有更好的方法吗?

4

2 回答 2

0

要做到这一点比这更复杂。话虽如此,有些开源项目已经这样做了,所以你可以从那里借用一些代码。一个例子在这里:

http://docs.jboss.org/jbossas/javadoc/4.0.2/org/jboss/logging/util/LoggerStream.java.html

于 2013-10-02T17:32:59.733 回答
0

我会使用一个重定向到您使用的日志框架的 OutputStream。它相当容易实现(我假设字符集是 ISO,所以没有花哨的编码处理):

final class RedirectionOutputStream extends OutputStream {

    StringBuilder buffer = new StringBuilder();

    @Override
    public synchronized void write(final int b) throws IOException {
        final char c = (char) (b & 0xFF);
        buffer.append(c);
        if (c == '\n') {
             // send buffered data to logging framework (its a complete line now)
             // reset buffer
             buffer.setLength(0);
        }
    }
}

这就是它的要点,但是对于您的日志框架,细节可能会有所不同。主要问题是记录器通常希望记录字符串,并且您从重定向的流中获取原始编码字节,因此您必须反转编码(在此示例中通过原始转换,从技术上讲,这应该使用阅读器完成)。

于 2013-10-02T17:42:41.497 回答