Ответ 1
Для этого вам нужно написать свои аннотации. Вот такая попытка использования aspectj AOP: http://javakane.blogspot.ro/2012/07/automate-log4j-logging-with-aop-and.html
Есть ли библиотека, которая позволит регистрировать переменные, просто добавляя аннотации, такие как:
@Log
String someValueToLog = someMethod();
@Log(level="debug",prefix="Here the value=")
String someValueToLogAgain = someMethod();
Это похоже на добавление этой строки в код:
log.info(someValueToLog);
log.debug("Here the value="+someValueToLogAgain);
Для этого вам нужно написать свои аннотации. Вот такая попытка использования aspectj AOP: http://javakane.blogspot.ro/2012/07/automate-log4j-logging-with-aop-and.html
Я создал проект под названием 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, для которого было разработано это доказательство концепции.
Идея состоит в том, чтобы упростить исходный код, удалив тривиальные операторы, в этом случае журнал.
Общая логика выглядит следующим образом:
Имейте в виду, что текущий проект предназначен для использования с IBM WebSphere Commerce, но вы можете легко его отрегулировать, например, вносить в код собственные логические операторы.
Ведение журнала выполняется внутри реальных логических аннотаций, которые могут использоваться только для определенных элементов исходного кода. вы можете в большинстве случаев использовать 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
}
http://aspect4log.sf.net позволяет регистрировать вызовы методов, аргументы, возвращаемое значение, исключение броска (оно даже позволяет вам изменять уровень журнала в зависимости от по исключению, по умолчанию он использует ERROR для непроверенных исключений и WARN для отмеченных исключений. Это помогло мне значительно сократить код шаблона и улучшить протоколирование.
Я также знаю о http://loggifier.unkrig.de - он регистрируется через java.util.logging(который никто не использует), немного слишком сложный для настройки, но не тот документ, но у него есть одна БОЛЬШАЯ функция - он утверждает, что он может инструментально уже скомпилировать файлы jar/war/ear (что здорово, если вы хотите профилировать кого-то uglry jar, который вы не можете перекомпилировать)!
Нижняя строка - если у вас собственный код, ваш выбор - aspect4log. Если вы не являетесь владельцем кода - перейдите к loggifier.
Вы можете сделать это относительно легко, если используете Spring и аспектно-ориентированное программирование. Взгляните на это.