Redirect System.out.println to log

前端 未结 5 1311
孤城傲影
孤城傲影 2021-01-11 15:51

In my project test suite there is big usage of

System.out.println 

I\'m trying to redirect these output to log file (through configuration

5条回答
  •  悲哀的现实
    2021-01-11 16:39

    Given that it's better replace the System.out.println(), sometimes we have no choice. Anyway I've made a little utility for that:

    SystemOutToSlf4j.enableForClass(MyClass.class)
    

    Then all the println originated from MyClass will be redirected to the logger. See this post for more details...

    public class SystemOutToSlf4j extends PrintStream {
    
      private static final PrintStream originalSystemOut = System.out;
      private static SystemOutToSlf4j systemOutToLogger;
    
      /**
       * Enable forwarding System.out.println calls to the logger if the stacktrace contains the class parameter
       * @param clazz
       */
      public static void enableForClass(Class clazz) {
        systemOutToLogger = new SystemOutToSlf4j(originalSystemOut, clazz.getName());
        System.setOut(systemOutToLogger);
      }
    
    
      /**
       * Enable forwarding System.out.println calls to the logger if the stacktrace contains the package parameter
       * @param packageToLog
       */
      public static void enableForPackage(String packageToLog) {
        systemOutToLogger = new SystemOutToSlf4j(originalSystemOut, packageToLog);
        System.setOut(systemOutToLogger);
      }
    
      /**
       * Disable forwarding to the logger resetting the standard output to the console
       */
      public static void disable() {
        System.setOut(originalSystemOut);
        systemOutToLogger = null;
      }
    
      private String packageOrClassToLog;
    
      private SystemOutToSlf4j(PrintStream original, String packageOrClassToLog) {
        super(original);
        this.packageOrClassToLog = packageOrClassToLog;
      }
    
      @Override
      public void println(String line) {
        StackTraceElement[] stack = Thread.currentThread().getStackTrace();
        StackTraceElement caller = findCallerToLog(stack);
        if (caller == null) {
          super.println(line);
          return;
        }
    
        org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(caller.getClass());
        log.info(line);
      }
    
      public StackTraceElement findCallerToLog(StackTraceElement[] stack) {
        for (StackTraceElement element : stack) {
          if (element.getClassName().startsWith(packageOrClassToLog))
            return element;
        }
    
        return null;
      }
    
    }
    

提交回复
热议问题