Java: действительно ли возможно автоматически добавить операторы журнала к методам?

Большинство методов в моем приложении записано как это:

public void m() {
    long t1 = System.currentTimeMillis();
    log.info("begin - m()");

    /* method body */

    long t2 = System.currentTimeMillis();
    log.info("end - m(), took " + (t2 - t1) + "ms.");
}

Мне бы хотелось просто аннотировать свой метод и иметь операторы журнала быть автоволшебно сгенерированным вместо этого:

@Log("executionTime")
public void m() {
    /* method body */
}

Какие-либо идеи о том, как возобновить этот подход? Там кто-либо - известное решение?

Кто-то предложил AOP для этого. Проблема состоит в том, что с AspectJ или Spring AOP я должен был бы описать все методы, который составляет столько же кода сколько вызовы журнала в самом методе.

5
задан Leonel 18 January 2010 в 13:01
поделиться

8 ответов

AspectJ и Spring AOP поддерживают нечто вроде:

execution(* com.company.project..*.*(..))

, что охватит все методы во всех подпакетах проекта . Таким образом, нет необходимости определять все методы по одному.

14
ответ дан 18 December 2019 в 07:29
поделиться

Вы должны использовать аспект к этому требованию. Это требование представляет собой скрещенную проблему (озабоченность о том, что «сокращает» между множеством занятий).

Чтобы захватить методы, которые вы хотите, чтобы соответствовать, вам следует создать pointcut, который соответствует одному или нескольким точкам соединения. Точка соединения - это то, что может быть выполнено в вашем коде (например, способ).

Посмотрите эти простые примеры о трассировке и ведении и в в в этой ссылки о подстановочных центах и ​​указателях .

0
ответ дан 18 December 2019 в 07:29
поделиться

Я не думаю, что он будет реализован в обозримом будущем. Идея использования стороннего проводника не плоха, но TortoitySVN является расширением оболочки Windows, и я не думаю, что они пойдут по пути записи плагинов для альтернативных браузеров файлов.

В сайт subversion перечисляется несколько клиентов . Некоторые из них являются инструментами GUI и реализуют свои собственные браузеры файлов (например, RapidSVN). Это может быть альтернатива, и, конечно, им не нужно полностью заменять TortoireSVN.

-121--3753618-

Вы также можете использовать последовательности .Формат и вот документация различных возможных форматов, но мне нравится Йохан Шиханс шпаргалка больше в качестве краткой справки.

decimal number=4711.00004711m;
4711.00004711
string.Format("{0:0.#############}",number);
"4711,00004711"
number=42;
42
string.Format("{0:0.#############}",number);
"42"
-121--3357815-

Закомментируйте вызовы регистрации или профилирования уникальным термином поиска:

void myfunc() {

  //log-call-123: try { long log_t1 = System.currentTimeMillis();        
  //log-call-123: log.info("begin - myfunc()"); {

  ...
  normal method code
  ...

  //log-call-123: } } finally { long log_t2 = System.currentTimeMillis();         
  //log-call-123: log.info("end - myfunc(), took " + (log_t2 - log_t1) + "ms."); }

}

При поиске и замене:

Поиск: «//log-call-123: »

Замените на: «/* log-call-123 */»

Выполните обратный поиск и

-1
ответ дан 18 December 2019 в 07:29
поделиться

Как было предложено вам, AOP хорошо подходит для обслуживания этого требования. Не уверен, что вы имели в виду под «необходимостью описать все методы». Из того, что я знаю, есть способы использования подстановочных знаков, чтобы указать методы, к которым применяются аспекты, которые могут облегчить вашу работу «описывания». Это верно, по крайней мере, в случае весеннего AOP ..

И Да, CGLIB, предложенный Морисом, является еще одним хорошим кандидатом на ваше рассмотрение. Никогда не использовал это, хотя.

3
ответ дан 18 December 2019 в 07:29
поделиться

Perf4j поддерживает получение информации о времени для методов с использованием аннотаций. См. здесь в своем руководстве разработчика.

1
ответ дан 18 December 2019 в 07:29
поделиться

Aspectj имеет концепцию точка соединения , которая похожа на подстановочный знак, который может указать любые методы, которые соответствуют этой подстановочнойкардизме (вы можете указать определенные методы в классе или в любом классе, который соответствует подстановочнойкардией). Затем вы можете создать аспект , который содержит до рекомендаций и , а после рекомендаций , которые являются методами, работающими до и после метода, сопоставленного точкой объединения. Вы можете генерировать свои методы журнала таким образом.

1
ответ дан 18 December 2019 в 07:29
поделиться

В то время как это не является фактическим практическим ответом на ваш вопрос, только (некоторые хорошие ответы были в отношении AOP), я считаю, что концепция ARM в Java 7 Должен быть жизнеспособным вариантом для реализации чего-то вроде этого в небольшом масштабе.

Вы можете определить класс регистрации утилиты и завод для создания этого класса, что-то вроде следующего:

public class TimerFactory
{
    private static final Logger log = ...; // Obtain however

    static class Timer implements Disposable<RuntimeException>
    {
        private final long startTime;
        private final String name;

        private Timer(String name)
        {
           this.name = name;
           startTime= System.currentTimeMillis();
           log.info("begin - " + name);
        }

        public void close()
        {
           final long t2 = System.currentTimeMillis();
           log.info("end - " + name + ", took " + (t2 - t1) + "ms.");
        }
    }

    public static Timer getTimer(String name)
    {
       return new Timer(name);
    }
}

Теперь с этой бойцевой табличкой из пути (по сути, инкапсуляция вашего поведения ведения журнала), его можно назвать следующим образом :

public void m() {
   try (TimerFactory.getTimer("m()")) {

      /* method body */

   }
}

Первый метод журнала будет вызываться на входе в блок TRY, и записано время начала. Когда блок Try был выходом, ресурс (Timer в этом случае) автоматически будет автоматически «закрыт», что приведет к вычислению окончательного времени и регистрироваться. Обратите внимание, что потому, что это старт блок , концевая величина произойдет независимо от того, брошен ли исключением или нет. Ваш оригинальный код, вероятно, должен использовать блок Try-Came, чтобы убедиться, что регистрация действительно завершена.

Очевидно, что это все еще требует от вас несколько кода ведения журнала на каждом сайте, поэтому на самом деле не является заменой для умных потенциалов и AOP, даже когда Java 7 выпущен. Однако, если вы окажетесь в каждую вход в систему, а затем в пожалуй, несколько способов, этот шаблон является хорошим способом абстрагирования проблем регистрации и позволит вам повторно использовать его с минимальным количеством котельной.

1
ответ дан 18 December 2019 в 07:29
поделиться

CGLIB позволяет модифицировать код метода во время выполнения

.
2
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: