6

我有一些在我身上调用 System.out.println 的库,我想通过 log4j 或 commons 日志记录重定向它们。但特别是我想保留完全限定的类名,这样我就知道是哪个组件生成了日志。

有没有一种很好的、​​有序的方法来完成这个?


更新:完成此操作后,我在此处发布了代码:
http ://www.bukisa.com/articles/487009_java-how-to-redirect-stderr-and-stdout-to-commons-logging-with-the-calling-class

4

2 回答 2

18

我能想到的唯一方法是编写自己的PrintStream实现,在println调用方法时创建一个堆栈跟踪,以便计算出类名。这将是非常可怕的,但它应该可以工作......概念证明示例代码:

import java.io.*;

class TracingPrintStream extends PrintStream {
  public TracingPrintStream(PrintStream original) {
    super(original);
  }

  // You'd want to override other methods too, of course.
  @Override
  public void println(String line) {
    StackTraceElement[] stack = Thread.currentThread().getStackTrace();
    // Element 0 is getStackTrace
    // Element 1 is println
    // Element 2 is the caller
    StackTraceElement caller = stack[2];
    super.println(caller.getClassName() + ": " + line);
  }
}

public class Test {
  public static void main(String[] args) throws Exception {
    System.setOut(new TracingPrintStream(System.out));
    System.out.println("Sample line");
  }
}

(在您的代码中,您可以将其记录到 log4j 而不是……或者也可以。)

于 2011-04-19T07:15:00.653 回答
1

如果您可以修改源代码,请查看Eclipse Plugin Log4E。它提供了一个函数来将 System.out.println 转换为记录器语句(以及许多其他处理记录的很酷的东西)。

于 2011-04-19T07:06:50.363 回答