【问题标题】:Capture stdout in log4j/log4net在 log4j/log4net 中捕获标准输出
【发布时间】:2009-02-23 16:17:23
【问题描述】:

我有一个用 Java 写入标准输出的库。我想使用 log4j 在日志中捕获此输出。 (这个库不是我写的,所以我无法控制库里面的代码)。

有没有简单的方法来做到这一点? System.setOut 是正确的方法吗?我应该向 System.setOut 传递什么?

另外,您将如何在 .NET/C# 中执行此操作?

【问题讨论】:

    标签: c# java logging stdout


    【解决方案1】:

    一种解决方案是继承OutputStream。你只需要实现write( int b )。然后在构造函数中使用您的OutputStream 创建一个PrintStream

    它可能看起来像:

    public class L4JOS extends OutputStream {
      logger = Logger.getLogger( "std.out" );
      private int lineEnd = (int)'\n';
      private ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
      public void write( int b ) throws IOException {
        baos.write( b );
        if ( b == lineEnd ) {
          logger.info( baos.toString() );
          baos.reset();
        }
      }
    
    }
    

    如果它是多线程的,那么你有更多的工作。并确保 appender 不会转到 System.out。

    【讨论】:

    【解决方案2】:

    您可以实现自己的 OutputStream,它将输出的任何内容记录到 log4j,然后将用户 System.setOut 记录到该 OutputStream 的实例。

    请注意,在 log4j 在标准输出上输出内容的情况下,这可能会导致无限循环。

    所以你可能应该做一些过滤来确定传递给 log4j 的内容以及传递给原始 stdout 流的内容

    【讨论】:

      【解决方案3】:

      你为什么要这样做。你不应该直接写入 sysout,如果你想输出到 sysout,你应该写入 log4j 并配置控制台附加程序。

      【讨论】:

      • 我没有写这个库,我只是在使用它,我想捕获它产生的输出。
      • 赞成,因为它可能会引导其他人走上正轨,尽管它不是解决手头问题的正确方法。
      【解决方案4】:

      您应该能够将 GUI 应用程序 chainsaw 连接到标准输出并获得所需的结果。

      【讨论】:

        【解决方案5】:

        我不想使用 setOut(),因为它是一个全局变量。你会遇到“远距离行动”:你只想为这个库截取标准输出,而不是践踏任何可能需要使用标准输出的东西。

        如果可能,在单独的进程空间中运行调用库函数的代码;然后您可以编写一个线程,从该进程读取标准输出并发送到记录器。

        new Thread() {
          public void run() {
            ProcessBuilder pb = new ProcessBuilder(command);
            Process p = pb.start();
            BufferedReader in = new BufferedReader(p.getInputStream());
            String line;
            while ((line = in.readLine()) != null) {
              log.info(line);
              // or you could parse line and try to dynamically pick a log level
            }
          }
        }
        

        您需要一种很好的方法将被调用进程的输出返回给调用者,但如果它像返回一个值一样简单,那么将它作为标准输出的最后一行返回应该很容易,或者带有特殊信号代码的行之类的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-23
          • 2013-05-11
          • 1970-01-01
          • 2017-07-09
          相关资源
          最近更新 更多