Запись аннотаций для Java

Есть ли библиотека, которая позволит регистрировать переменные, просто добавляя аннотации, такие как:

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

Это похоже на добавление этой строки в код:

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

Ответ 2

Я создал проект под названием 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 регистрирует TaskListener в компиляторе (Javac).
  • TaskListener использует Javassist для преобразования операторов журнала в байтовый код данного метода/класса.

Имейте в виду, что текущий проект предназначен для использования с IBM WebSphere Commerce, но вы можете легко его отрегулировать, например, вносить в код собственные логические операторы.

Ответ 3

Ведение журнала выполняется внутри реальных логических аннотаций, которые могут использоваться только для определенных элементов исходного кода. вы можете в большинстве случаев использовать log LOCAL_VARIABLE, но никогда не сможете его использовать для регистрации plain statements.

Пожалуйста, проверьте slf4j, который предоставляет общие аннотации регистрации событий.

Элементы, для которых поддерживается объявление Annotation:

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

}

Аналогично созданию пользовательских аннотаций

Ответ 4

http://aspect4log.sf.net позволяет регистрировать вызовы методов, аргументы, возвращаемое значение, исключение броска (оно даже позволяет вам изменять уровень журнала в зависимости от по исключению, по умолчанию он использует ERROR для непроверенных исключений и WARN для отмеченных исключений. Это помогло мне значительно сократить код шаблона и улучшить протоколирование.

Я также знаю о http://loggifier.unkrig.de - он регистрируется через java.util.logging(который никто не использует), немного слишком сложный для настройки, но не тот документ, но у него есть одна БОЛЬШАЯ функция - он утверждает, что он может инструментально уже скомпилировать файлы jar/war/ear (что здорово, если вы хотите профилировать кого-то uglry jar, который вы не можете перекомпилировать)!

Нижняя строка - если у вас собственный код, ваш выбор - aspect4log. Если вы не являетесь владельцем кода - перейдите к loggifier.

Ответ 5

Вы можете сделать это относительно легко, если используете Spring и аспектно-ориентированное программирование. Взгляните на это.