Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
onixred
7 лет назад

Записки юного джависта 2 Создаем свою аннотацию для логирования

Всем привет

Я давно не писал о java "вещах".

Итак, начнем, для своего проекта мне понадобилось логировать методы. Согласитесь не всегда удобно писать вот такие строчки

Есть много минусов такой реализации, предлагаю о плюсах и минусах поговорить в комментариях =).
И так давайте создадим библиотеку которая будет логировать наши методы сама.

Создаем новый Maven проект. Тут все просто мы это уже проходили =)

Добавляем в проект нашу новую аннотацию. Я ее назвал Loggable. У аннотацию могут быть как обязательные поля так и не обязательные. поля Для не обязательных нужно указывать значение по умолчанию через ключевое слово default.
Пример:

public @interface Loggable {
String name();
String type() default  “simple type”;
}

Поле name обязательное, а type нет.
Парадокс, но саму аннотацию мы помечаем другими аннотациями=)

  • @Retention - указывает жизненный цикл нашей аннотации
  • @Target - указывает, что можно помечать этой аннотацией
  • @Component - указывает, что Spring позволит искать бины-сервисы автоматически, через autoscan.
  • @Documented - указывает, что для аннотации будет сгенерирована документации JavaDoc. По умолчанию информация о аннотацие не добавляется в документацию JavaDoc.


Добавляем вспомогательный класс для распределения уровней логирования. Я думаю с этим классом вопросы не возникнут просто распределяем уровень логирования.

А теперь самое сложное, это научиться обрабатывать аннотацию. Создадим аспекта в стиле @AspectJ
Для этого помечаем аннотацией @Aspect - указывает, что является аспектом.
Далее метод around помечаем @Around с параметром "@within(ru.maksimov.andrey.log.Loggable) || @annotation(ru.maksimov.andrey.log.Loggable)" - указывает, что методом around обернут любой метод с аннотацией "Loggable".
Сначала получаем параметры нашей аннотации.

Method method = signature.getMethod();
Loggable loggableMethod = method.getAnnotation(Loggable.class);
Loggable loggableClass = proceedingJoinPoint.getTarget().getClass().getAnnotation(Loggable.class);
LogLevel logLevel = loggableMethod != null ? loggableMethod.value() : loggableClass.value();
boolean showParams = loggableMethod != null ? loggableMethod.params() : loggableClass.params();

Формируем строку записываем имя метода и параметры

if (showParams && proceedingJoinPoint.getArgs() != null && proceedingJoinPoint.getArgs().length > 0) {
sb.append('(');
for (int i = 0; i< proceedingJoinPoint.getArgs().length; i++) {
sb.append(method.getParameterTypes()[i].getName() + ":" + proceedingJoinPoint.getArgs()[i]);
if (i< proceedingJoinPoint.getArgs().length - 1) {
sb.append(", ");
}
}
sb.append(')');
} else {
sb.append("()");
}

Далее фиксируем время старта, выполняем метод и фиксируем время завершения метода.

long startTime = System.currentTimeMillis();
Object result = proceedingJoinPoint.proceed();
long endTime = System.currentTimeMillis();

Формируем строчку в лог с завершением метода. Если есть результат и в параметрах аннотации мы указывали что нужно выводить результат метода, то выводим еще и результат.

Вот и все. Теперь можно использовать нашу аннотацию =)

Ссылка на репозиторий

Примеры


А вот логи...

19
915.931 GOLOS
На Golos с December 2016
Комментарии (3)
Сортировать по:
Сначала старые