Я работал с кодовой базой компании, которая придерживается политики ведения большого количества журналов трассировки. Таким образом, почти каждый метод имеет фрагмент кода, который начинается так:
String LOG_METHOD = "nameOfMethod(String,List<Long>):void";
if(logger.isTraceEnabled()) {
Object[] params = new Object[] { string, list };
logger.trace(CompanyMessages.newMethodInstanceMessage(this, LOG_METHOD, params));
}
и заканчиваться так (либо в finally
-предложении, либо просто в конце метода:
if(logger.isTraceEnabled()) {
logger.trace(CompanyMessages.leaveMethodInstanceMessage(this, LOG_METHOD));
}
На самом деле там больше кода, но это основная идея. Это загромождает код, и другие кодеры постоянно запутывают его своими собственными интерпретациями, которые не используют определенный класс CompanyMessages
, необходимый для форматирования сообщений, которые должны быть прочитаны инструментами мониторинга. Поэтому я ищу способ избавиться от всего кода выше и просто предоставить все методы, которые требуют ведения журнала трассировки, с аннотациями, такими как: @LogBefore('logLevel')
и @LogAfter('logLevel')
.
Причина, по которой я выбрал это решение, заключается в том, чтобы другим разработчикам не нужно было изучать что-то новое, кроме как использовать аннотации вместо кода. Я работаю в серверной среде, в которой мы развертываем сотни веб-приложений и десятки разработчиков. Поэтому я искал способ реализовать это в веб-приложении без большого количества дополнительного кода или дополнительных больших библиотек. Это означает, что я ищу небольшую стабильную реализацию АОП с использованием аннотаций, подобных тем, которые я предложил, и которую легко настроить в каждом веб-приложении. Производительность также важна. Каков самый простой пример реализации этого с помощью АОП?
Изменить: я нашел что-то очень похожее на то, что я ищу, но у этого есть пара проблем. Все классы, которым требуется ведение журнала, должны быть настроены, что потребует больше ресурсов, чем простое использование аннотаций. Исправит ли это пружинная конфигурация <aop:aspectj-autoproxy/>
?