Перенаправьте System.out.println в Log4J, сохраняя информацию об имени класса - PullRequest
4 голосов
/ 19 апреля 2011

У меня есть несколько библиотек, которые вызывают System.out.println, я бы хотел перенаправить их через log4j или ведение журнала общего достояния.Но, в частности, я бы хотел сохранить полное имя класса, чтобы я знал, какой компонент генерировал журналы.

Есть ли хороший, упорядоченный способ сделать это?


ОБНОВЛЕНИЕ: После этого я разместил код здесь:
http://www.bukisa.com/articles/487009_java-how-to-redirect-stderr-and-stdout-to-commons-logging-with-the-calling-class

Ответы [ 2 ]

16 голосов
/ 19 апреля 2011

Единственный способ, о котором я могу подумать, - написать собственную реализацию 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, а не ... или, возможно, также.)

1 голос
/ 19 апреля 2011

Если вы можете изменить исходный код, взгляните на Eclipse Plugin Log4E .Он предоставляет функцию для преобразования System.out.println в операторы логгера (и многие другие интересные вещи, связанные с логированием).

...