我有一些在我身上调用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,因此 首先