截取System.out并在Java中预置日期时间

时间:2013-06-22 05:42:06

标签: java system.out

是否可以拦截对System.out.print *和System.err.print *(在Java中)的调用并为它们添加时间戳?不用担心,我们使用通常的日志记录框架,但偶尔会有一些sys.out漏出来,知道它何时发生会很好,所以我们可以把它绑定到正确的日志文件。

3 个答案:

答案 0 :(得分:7)

你可以做到。

See the docs

  

重新分配“标准”输出流。   首先,如果有安全管理器,则使用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);

如果PrintStreamSystem.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);
}

然后你需要把这一切都放在一个方面并将它编织到你的代码中 - 在线有很多关于如何做到这一点的教程。