Redirect System.out.println to Log4J, while keeping class name information

前端 未结 2 1352
孤街浪徒
孤街浪徒 2020-12-09 06:36

I have some libraries that are calling System.out.println on me, I\'d like to redirect them through log4j or commons logging. But in particular I\'d like to keep the fully-q

相关标签:
2条回答
  • 2020-12-09 07:22

    If you can modify the source code, then have a look at the Eclipse Plugin Log4E. It provides a function to convert System.out.println into logger statements (and many other cool stuff dealing with logging).

    0 讨论(0)
  • 2020-12-09 07:37

    The only way I can think of would be to write your own PrintStream implementation which created a stack trace when the println method was called, in order to work out the class name. It would be pretty horrible, but it should work... proof of concept sample code:

    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");
      }
    }
    

    (In your code you would make it log to log4j instead of course... or possibly as well.)

    0 讨论(0)
提交回复
热议问题