我创建了一个名为log-weaver的项目,其中引入了许多 @LogXXX 语句。
当您编译使用这些注释之一的项目时,日志语句将编织到字节码中。
示例源代码:
@LogEnteringAndExiting(value={"arg1", "this"})
public String execute(String arg1) {
/*Some logic*/
return "done";
}
源代码将保持原样,但字节码看起来就像源代码是这样编写的:
private static final Logger comGithubHervian_LOGGER = LoggingHelper.getLogger(ClassWithLogAnnotatedMethods.LogAround_log1ArgumentAndThis.class);
private static final String = comGithubHervian_CLASSNAME = ClassWithLogAnnotatedMethods.LogAround_log1ArgumentAndThis.class.getName();
public String execute(String arg1) {
if (LoggingHelper.isEntryExitTraceEnabled((Logger)comGithubHervian_LOGGER)) {
comGithubHervian_LOGGER.entering(comGithubHervian_CLASSNAME, "execute", new Object[]{arg1, this});
}
/*Some logic*/
String string = "done";
if (LoggingHelper.isEntryExitTraceEnabled((Logger)comGithubHervian_LOGGER)) {
comGithubHervian_LOGGER.exiting(comGithubHervian_CLASSNAME, "execute", string);
}
return string;
}
在上面的代码中,LoggingHelper 是 IBM 的 WebpShere Commerce 中的一个特殊类,为此开发了这个概念证明。
这个想法是通过删除琐碎的语句来简化源代码,在这种情况下是日志记录。
整体逻辑如下:
- AbstractProcessor 检测日志注释的使用,并创建一些有用的数据结构,以保存有关方法名称、参数等的信息。
- AbstractProcessor 在编译器 (Javac) 中注册一个 TaskListener。
- TaskListener 使用 Javassist 将日志语句编织到给定方法/类的字节码中。
请注意,当前项目是为与 IBM 的 WebSphere Commerce 一起使用而设计的,但您可以轻松地对其进行调整,例如将您自己选择的日志语句编织到代码中。