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);
4

4 回答 4

3

http://aspect4log.sf.net允许您记录方法调用、参数、返回值、抛出的异常(它甚至允许您根据异常更改日志级别,默认情况下,它使用 ERROR 表示未检查的异常,使用 WARN 表示已检查的异常. 它在删除样板代码和改进日志记录方面帮助了我很多。

我也知道http://loggifier.unkrig.de - 它通过 java.util.logging 进行日志记录(没有人使用),设置起来有点复杂,文档也不是很好,但它有一个很大的功能 -它声称它可以检测已经编译的 jar/war/ear 文件(如果您想分析某人无法重新编译的丑陋 jar,那就太好了)!

底线 - 如果你拥有代码,aspect4log 是你的选择。如果你不拥有代码 - 去记录器。

于 2015-05-10T18:00:23.077 回答
3

我创建了一个名为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 中的一个特殊类,为此开发了这个概念证明。

这个想法是通过删除琐碎的语句来简化源代码,在这种情况下是日志记录。
整体逻辑如下:

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

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

于 2016-12-13T12:00:37.227 回答
1

日志记录是在实际的逻辑注释中完成的,只能用于源代码中的特定元素。您最多可以LOCAL_VARIABLE使用它来记录,但它永远不能用于记录plain statements.

请检查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

}

类似于创建自定义注释

于 2012-09-04T11:48:29.913 回答
0

如果您使用 Spring 和面向方面的编程,您可以相对容易地做到这一点。看看那个。

于 2012-09-04T11:47:38.860 回答