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?
  2. Настройка
  3. Итоги

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 AOPspring-aop-5.1.4.RELEASE.jar
Версия Spring Beansspring-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.

TestAop.java


@Component
public class TestAop{
    public void testMethod() {

        return;

    }

}

2-2. Определите AOP в applicationContext.xml

Объявите перехватчик и pointcut в applicationContext.xml. Красным выделены строки конфигурации AOP.

applicationContext.xml


<?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". Красным цветом выделены области, которые необходимо установить. Остальные настройки могут быть введены произвольно.

logback.xml


<?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 и следите, чтобы в журналы не попадали конфиденциальные аргументы или возвращаемые значения.

■INFORMATION

Статьи


■PROFILE

Профиль


■Контакты

Контакты