使用自定义安全管理器作为本机跟踪程序的低开销替代方法。
对于跟踪Java应用程序的文件系统访问,本机跟踪工具始终是首选。在Windows上,使用Process Monitor跟踪I / O。在Linux上,使用strace。其他平台也提供类似的功能。
通过直接在Java中进行跟踪,您可以解决环境限制。例如,在缺少该CAP_SYS_PTRACE功能的容器中strace不可用,并且容器主机并非始终可访问。此外,潜在的更轻量的跟踪机制可方便地在生产环境中进行跟踪。
要走Java路线,您可以通过扩展来实现自己的安全管理器java.lang.SecurityManager。此类提供了checkRead,checkWrite和checkDelete方法,一旦代码尝试进行相应的访问,它们就会被调用。
一个示例实现:
public class TraceSecurityManager extends SecurityManager {
public void checkRead(String file) {
System.out.println("Read: " + file);
super.checkRead(file);
}
public void checkRead(String file, Object context) {
System.out.println("Read: " + file);
super.checkRead(file, context);
}
public void checkWrite(String file) {
System.out.println("Write: " + file);
super.checkWrite(file);
}
public void checkDelete(String file) {
System.out.println("Delete: " + file);
super.checkDelete(file);
}
}
为了测试样本,我们使用Java编译器作为测试对象。为了启用跟踪安全管理器,我们设置适当的系统属性,并使用有效的Java源文件执行命令Test.java:
$ java -Djava.security.manager=TraceSecurityManager com.sun