当前位置: 首页 > 面试题库 >

将System.out.println重定向到Log4J,同时保留类名信息

钱志义
2023-03-14
问题内容

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

有没有一种很好的,有序的方法来完成此任务?

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


问题答案:

我能想到的唯一方法是编写自己的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而不是当然的日志……或者也可以。)



 类似资料:
  • 我想将stdout和stderr重定向到一个文件,同时保留输出顺序,然后还将stderr显示到屏幕上。我看到很多问题讨论它: https://unix.stackexchange.com/questions/9646/show-only-stderr-on-screen-but-write-both-stdout-and-stderr-to-file https://unix.stackexcha

  • 问题内容: 我的应用程序有许多System.out.println()语句。 我想从println捕获消息并将其发送到标准记录器(Log4j,JUL等)。 怎么做 ? 问题答案: System类具有,可以用于将输出流更改为例如具有支持的新File流,在这种情况下,可能是另一个使用你选择的日志记录子系统的流。 请记住,如果你将日志记录库配置为输出到标准输出或错误(可能是无限递归类型),则很可能会遇到

  • 我想让我的程序记录给定对象的XML使用: 目前,我使用stdout作为输出流。但是stdout没有打印在log4j日志文件中。 如何将此方法的输出重定向到log4j日志文件? 谢啦

  • 我正在使用这个文档将Tomcat记录器更改为log4j: 我仍然看到一个文件logs/catalina.out,而不是logs/test_catalina,这使我认为log4j没有被使用,或者我的属性文件没有被读取。 我在lib中有tomcat-juli-adapters.jar、log4j-1.2.17.jar和log4j.属性,并覆盖了bin/tomcat-juli.jar 运行set-x c

  • 我有一个与一个标题和位置关联的多个作者的df: 我希望输出忽略任何None值,如下所示: 任何帮助将不胜感激!

  • 问题内容: 我在cyberciti.biz的评论中看到了这个有趣的问题。 我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。 到目前为止,我对解决方案的想法是: 但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。 欢迎与您分享这个想法。:) 问题答案: 你要 这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此 首先