Spring DebugInterceptor: AOP-трассировка логирования для разработки
Дата публикации:
Обновлено:
Статьи > Spring DebugInterceptor: AOP-трассировка логирования для разработки
Статус 2026 года и безопасное использование
Кратко: DebugInterceptor — AOP-перехватчик, использующий прокси Spring. Он записывает вызовы методов на уровне TRACE и предназначен для ограниченной диагностики, а не для общей наблюдаемости в производственной среде.
Чему вы научитесь
- Как advisor выбирает методы и связывает перехватчик с нужными bean-компонентами Spring.
- Почему самовызовы и объекты, созданные вне контейнера Spring, могут обходить прокси.
- Как избежать раскрытия аргументов, личных данных, учетных данных или чрезмерного объема журнала.
Для кого: Разработчики Spring, поддерживающие приложения, настроенные на XML, или изучающие классический АОП на основе прокси.
Актуальность на 2026 год: Этот класс все еще существует в текущей документации Spring Framework, но приведенный ниже XML-пример Spring 5.1.4 является историческим. Используйте поддерживаемую линию Spring, ограничьте ведение журнала TRACE контролируемой диагностикой и отдайте предпочтение текущим метрикам, трассировке и структурированному журналированию для производственных операций.
Примечание по безопасности. Команды и примеры конфигурации из исходной статьи не проверялись повторно в современной производственной среде. Перед применением проверьте поддерживаемые версии, резервные копии, контроль доступа и процедуру отката в отдельной тестовой среде.
Официальные первоисточники
Обзор
В статье показано, как настроить Spring DebugInterceptor, чтобы с помощью AOP регистрировать вход в выбранные методы и выход из них. Документация дополнена воспроизводимым примером для Spring 5.1.4.
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-api
Оглавление
1. Что такое DebugInterceptor?
DebugInterceptor — перехватчик Spring AOP, который записывает в журнал вход в метод и выход из него. В примере используются перечисленные ниже библиотеки Spring 5.1.4.
https://mvnrepository.com/artifact/org.springframework/spring-aop/5.1.4.RELEASE
Используемый класс — "org.springframework.aop.interceptor.DebugInterceptor".
Аспектно-ориентированное программирование (AOP) применяет сквозное поведение к объектам под управлением DI-контейнера Spring, не смешивая его с логикой приложения.
Здесь DebugInterceptor связывается с компонентом, созданным с помощью @Component.
1-1. среда реализации
В этом разделе описано используемый Jar и версию, так как могут быть небольшие различия в зависимости от окружения.
| Версия Spring AOP | spring-aop-5.1.4.RELEASE.jar |
|---|---|
| Версия Spring Beans | spring-beans-5.1.4.RELEASE.jar |
| Библиотеки журналирования | slf4j-api-1.7.25.jar logback-core-1.2.3.jar |
1-2. Требуется работа.
Необходимая работа заключается в следующем.
- Создайте экземпляр с помощью @Component.
- Определите AOP в applicationContext.xml
- Изменение настроек вывода журнала
2. Настройка
В следующих разделах эти шаги применяются к простой демонстрационной программе.
2-1. Создайте экземпляр с помощью @Component.
Подготовьте класс с "@Component", объявленный следующим образом. Выполните только 'return', так как вы хотите видеть только AOP.
@Component
public class TestAop{
public void testMethod() {
return;
}
}
2-2. Определите AOP в applicationContext.xml
Объявите перехватчик и pointcut в applicationContext.xml. Красным выделены строки конфигурации AOP.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
~сокращение~
<!-- Тестирование Spring AOP. -->
<bean id="debugInterceptor" class="org.springframework.aop.interceptor.DebugInterceptor" />
<aop:config>
<aop:advisor advice-ref="debugInterceptor"
pointcut="execution(* com.example.TestAop.testMethod(..))" />
</aop:config>
</beans>
'pointcut' записывается следующим образом.
pointcut="execution(* название пакета.имя класса.имя метода(..))"
В приведенном выше примере это будет выглядеть следующим образом.
• название пакета: com.example
• имя класса: TestAop
• имя метода: testMethod
Если вы хотите применить его ко всем методам, действует следующее.
• pointcut="execution(* com.example.TestAop.*(..))"
2-3. Изменение настроек вывода журнала
Измените уровень ведения журнала только для DebugInterceptor, так как уровень вывода журнала, описанный в DebugInterceptor, - "TRACE". Красным цветом выделены области, которые необходимо установить. Остальные настройки могут быть введены произвольно.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern><![CDATA[date:%d{yyyy-MM-dd HH:mm:ss}\tthread:%thread\tX-Track:%X{X-Track}\tlevel:%-5level\tlogger:%-48logger{48}\tmessage:%msg%n]]></pattern>
</encoder>
</appender>
<appender name="APPLICATION_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${app.log.dir:-log}/todo-application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${app.log.dir:-log}/todo-application-%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern><![CDATA[date:%d{yyyy-MM-dd HH:mm:ss}\tthread:%thread\tX-Track:%X{X-Track}\tlevel:%-5level\tlogger:%-48logger{48}\tmessage:%msg%n]]></pattern>
</encoder>
</appender>
<logger name="org.springframework.aop.interceptor" level="trace">
<appender-ref ref="STDOUT" />
<appender-ref ref="APPLICATION_LOG_FILE" />
</logger>
<root level="warn">
<appender-ref ref="STDOUT" />
<appender-ref ref="APPLICATION_LOG_FILE" />
</root>
</configuration>
В spring-aop-5.1.4.RELEASE.jar эти сообщения недоступны на уровне DEBUG: logger перехватчика должен допускать TRACE.
Если записей нет, проверьте pointcut, прохождение вызова через прокси Spring и фактический уровень logger.
2-4. Результат.
Если вы вызовете testMethod в TestAop.java с выполненными вышеуказанными настройками, должен быть выведен следующий журнал. Журнал длинный, поэтому я удалил несколько строк, но он должен выводить по две строки для входа и выхода, итого четыре строки.
date:2021-01-18 15:26:35 thread:http-nio-8081-exec-3 X-Track:84b8ab0aa6504352a815ce85167a1981 level:TRACE logger:o.s.aop.interceptor.DebugInterceptor message:Entering ReflectiveMethodInvocation
date:2021-01-18 15:26:35 thread:http-nio-8081-exec-3 X-Track:84b8ab0aa6504352a815ce85167a1981 level:TRACE logger:o.s.aop.interceptor.DebugInterceptor message:Entering ReflectiveMethodInvocation
date:2021-01-18 15:26:40 thread:http-nio-8081-exec-3 X-Track:84b8ab0aa6504352a815ce85167a1981 level:TRACE logger:o.s.aop.interceptor.DebugInterceptor message:Exiting ReflectiveMethodInvocation
date:2021-01-18 15:26:40 thread:http-nio-8081-exec-3 X-Track:84b8ab0aa6504352a815ce85167a1981 level:TRACE logger:o.s.aop.interceptor.DebugInterceptor message:Exiting ReflectiveMethodInvocation
3. Итоги
Используйте DebugInterceptor только для контролируемой диагностики, сужайте pointcut и следите, чтобы в журналы не попадали конфиденциальные аргументы или возвращаемые значения.