有没有一个Java库可以添加日志注解?

16

有没有一个库可以通过添加注释来记录变量?例如:

    @Log
    String someValueToLog = someMethod(); 

    @Log(level="debug", prefix="Here's the value=")
    String someValueToLogAgain = someMethod(); 

这个函数类似于在代码中添加这行代码:

    log.info(someValueToLog);
    log.debug("Here's the value=" + someValueToLogAgain);

1
预期的行为是什么?记录变量的每次写入,包括堆栈跟踪吗? - bbaja42
你有没有考虑过日志记录应该在什么时候进行?如果我这样做:@Log int i; while(i<999) i+=i*2; ... 这里应该记录什么? - Ridcully
@Ridcully ,是的,你说得有道理,但是我觉得 Log 注释只会记录一次。无论如何,我的语法想法可能是不正确的,但一定有办法实现这个。 - quarks
5个回答

3

http://aspect4log.sf.net可以记录方法调用、参数、返回值和抛出的异常(它甚至允许您根据异常更改日志级别,默认情况下对于未检查的异常使用ERROR,对于已检查的异常使用WARN)。 它帮助我大大减少了样板代码并改善了日志记录。

我也知道http://loggifier.unkrig.de - 它通过java.util.logging进行日志记录(没有人使用),设置有点复杂并且文档不是很好,但它有一个重要的功能 - 它声称可以对已编译的jar/war/ear文件进行仪器化(如果您想分析某人的丑陋jar文件而无法重新编译,则非常棒)!

总之 - 如果您拥有代码,则选择aspect4log。 如果您不拥有代码,请选择loggifier。


3

我创建了一个名为 log-weaver 的项目,其中引入了一些 @LogXXX 语句。
当你编译使用这些注解的项目时,Log语句会被织入字节码中。
例如源代码:

@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的特殊类,这个概念证明是为了开发它而设计的。其目的是通过删除一些琐碎的语句,比如日志记录,简化源代码。
总体逻辑如下:

  1. 一个AbstractProcessor检测到使用了其中一个记录注解,并创建一些有用的数据结构来保存有关方法名称、参数等的信息。
  2. AbstractProcessor在编译器(Javac)中注册TaskListener。
  3. TaskListener使用Javassist将日志语句编织到给定方法/类的字节码中。

请注意,当前项目专为IBM WebSphere Commerce设计,但您可以轻松地进行调整,例如将自己选择的日志语句编织到代码中。


有趣,我会去看看。 - quarks
也许你可以将这个发布到Maven中央仓库或者Bintray上。 - quarks
感谢您的回复,不幸的是,当前版本的项目不适合上传到Maven Central,它更像是一个模板。 - Hervian

1

日志记录是在实际逻辑内完成的,注释只能用于源代码中的特定元素。使用此方法,您最多可以记录LOCAL_VARIABLE,但永远不能用于记录普通语句

请查看slf4j,它提供了常见的日志记录注释。

支持注释声明的元素包括:

public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,

/** Field declaration (includes enum constants) */
FIELD,

/** Method declaration */
METHOD,

/** Parameter declaration */
PARAMETER,

/** Constructor declaration */
CONSTRUCTOR,

/** Local variable declaration */
LOCAL_VARIABLE,

/** Annotation type declaration */
ANNOTATION_TYPE,

/** Package declaration */
PACKAGE

}

创建自定义注释的类似方法


0
如果您使用Spring和面向切面编程,那么这个任务相对容易完成。建议您参考一下相关资料。

-1

这个问题不符合主题(规则与11年前有很大不同)。此外,仅提供链接的回答并不被视为有效回答。而在这种情况下,它们只是产品推荐。 - David Makogon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接