是否可以拦截对System.out.print *和System.err.print *(在Java中)的调用并为它们添加时间戳?不用担心,我们使用通常的日志记录框架,但偶尔会有一些sys.out漏出来,知道它何时发生会很好,所以我们可以把它绑定到正确的日志文件。
答案 0 :(得分:7)
你可以做到。
重新分配“标准”输出流。 首先,如果有安全管理器,则使用RuntimePermission(“setIO”)权限调用其checkPermission方法,以查看是否可以重新分配“标准”输出流。
public class CustomPrintStream extends PrinterStream{
//override print methods here
}
System.setOut(new CustomPrintStream());
答案 1 :(得分:2)
应该可以。
System.out是printStream。
您可以扩展流以将日期和时间附加到打印方法,并使用System.setOut()来适当地设置流。
如果您想要确定打印报表的来源,可以使用以下方法作为事后的想法:
Thread.currentThread().getStackTrace()[1].getClassName();
答案 2 :(得分:1)
您可以使用Aspect Oriented Programming来实现此目标 - 尤其是AspectJ工具。
您的想法是定义在代码中的点匹配的切入点,然后编写在这些点执行的通知。然后,AspectJ编译器将在您的建议中编织。
因此,对于您的问题,您首先会定义每次在print
PrintStream
方法时拾取的切入点
pointcut callPrint(PrintStream ps, String s) :
call(* java.io.PrintStream.print*(..)) && target(ps) && args(s);
如果PrintStream
为System.out
,您可以编写可以绕过此调用的建议来替换参数(您可以对System.err
执行相同操作。
void around(PrintStream ps, String s) : callPrint(ps,s) {
if(ps.equals(System.out)){
String new_string = ...
proceed(new_string);
}
else proceed(s);
}
然后你需要把这一切都放在一个方面并将它编织到你的代码中 - 在线有很多关于如何做到这一点的教程。