Spring DebugInterceptor: śledzenie logów AOP do celów programistycznych
Data publikacji:
Aktualizacja:
Artykuły > Spring DebugInterceptor: śledzenie logów AOP do celów programistycznych
Stan na rok 2026 i bezpieczne użytkowanie
W skrócie: DebugInterceptor to interceptor AOP wykorzystujący proxy Springa. Rejestruje wywołania metod na poziomie TRACE i służy do ograniczonej diagnostyki, a nie jako ogólne rozwiązanie obserwowalności w produkcji.
Czego się nauczysz
- Jak advisor wybiera metody i wiąże interceptor z właściwymi beanami Springa.
- Dlaczego samowywołania i obiekty utworzone poza kontenerem Springa mogą ominąć proxy.
- Jak uniknąć ujawniania argumentów, danych osobowych, danych uwierzytelniających lub nadmiernej ilości logów.
Dla kogo: Programiści Springa obsługujący aplikację skonfigurowaną w formacie XML lub uczący się klasycznego AOP opartego na proxy.
Aktualizacja na 2026 rok: Klasa nadal istnieje w aktualnej dokumentacji Spring Framework, ale poniższy przykład XML Spring 5.1.4 ma charakter historyczny. Użyj obsługiwanej linii Spring, ogranicz rejestrowanie TRACE do kontrolowanej diagnostyki i preferuj bieżące metryki, śledzenie i rejestrowanie strukturalne dla operacji produkcyjnych.
Uwaga dotycząca bezpieczeństwa: polecenia i przykłady konfiguracji z pierwotnego artykułu nie zostały ponownie uruchomione we współczesnym środowisku produkcyjnym. Przed użyciem sprawdź wspierane wersje, kopie zapasowe, kontrolę dostępu i procedurę wycofania w oddzielnym środowisku testowym.
Oficjalne źródła pierwotne
Przegląd
Artykuł pokazuje, jak skonfigurować Spring DebugInterceptor, aby za pomocą AOP rejestrować wejście do wybranych metod i wyjście z nich. Przykład uzupełnia dokumentację o powtarzalną konfigurację dla Spring 5.1.4.
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-api
Spis treści
1. Co to jest DebugInterceptor?
DebugInterceptor to interceptor Spring AOP, który zapisuje w logu wejście do metody i wyjście z niej. W przykładzie użyto wymienionych niżej bibliotek Spring 5.1.4.
https://mvnrepository.com/artifact/org.springframework/spring-aop/5.1.4.RELEASE
Używana klasa to "org.springframework.aop.interceptor.DebugInterceptor".
Programowanie aspektowe (AOP) pozwala stosować przekrojowe zachowanie do obiektów zarządzanych przez kontener DI Springa bez mieszania go z logiką aplikacji.
Tutaj DebugInterceptor jest powiązany z komponentem utworzonym za pomocą @Component.
1-1. środowisko realizacji
W tej sekcji podano używane pliki JAR i ich wersje, ponieważ szczegóły mogą się różnić zależnie od środowiska.
| Wersja Spring AOP | spring-aop-5.1.4.RELEASE.jar |
|---|---|
| Wersja Spring Beans | spring-beans-5.1.4.RELEASE.jar |
| Biblioteki logowania | slf4j-api-1.7.25.jar logback-core-1.2.3.jar |
1-2. Wymagana praca.
Wymagana jest następująca praca.
- Utwórz instancję z @Component.
- Zdefiniuj AOP w pliku applicationContext.xml
- Zmiana ustawień wyjścia dziennika
2. Konfiguracja
Kolejne sekcje stosują te kroki do prostej klasy demonstracyjnej.
2-1. Utwórz instancję z @Component.
Przygotuj klasę z deklaracją "@Component" w następujący sposób. Wykonaj tylko polecenie 'return', ponieważ chcesz zobaczyć tylko AOP.
@Component
public class TestAop{
public void testMethod() {
return;
}
}
2-2. Zdefiniuj AOP w pliku applicationContext.xml
Zadeklaruj interceptor i pointcut w pliku applicationContext.xml. Czerwone wiersze tworzą konfigurację 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">
~streszczenie~
<!-- Testowanie 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' zapisuje się w następujący sposób.
pointcut="execution(* nazwa pakietu.nazwa klasy.nazwa metody(..))"
W powyższym przykładzie będzie to wyglądało następująco.
• nazwa pakietu: com.example
• nazwa klasy: TestAop
• nazwa metody: testMethod
Jeśli chcesz zastosować tę zasadę do wszystkich metod, zastosuj poniższą procedurę.
• pointcut="execution(* com.example.TestAop.*(..))"
2-3. Zmiana ustawień wyjścia dziennika
Zmień poziom logowania tylko dla DebugInterceptora, ponieważ poziomem wyjścia dziennika opisanym w DebugInterceptorze jest "TRACE". Obszary zaznaczone na czerwono to te, które wymagają ustawienia. Pozostałe ustawienia można wprowadzić dowolnie.
<?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>
W spring-aop-5.1.4.RELEASE.jar te komunikaty nie są dostępne na poziomie DEBUG: logger interceptora musi dopuszczać TRACE.
Jeśli wpisy się nie pojawiają, sprawdź pointcut, przejście wywołania przez proxy Springa oraz faktyczny poziom loggera.
2-4. Wynik.
Po wywołaniu metody testMethod w pliku TestAop.java z wprowadzonymi wyżej ustawieniami powinien zostać wyświetlony następujący dziennik. Dziennik jest długi, więc usunąłem kilka wierszy, ale powinien zawierać po dwa wiersze dla poleceń Wejście i Wyjście, czyli w sumie cztery wiersze.
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. Podsumowanie
Używaj DebugInterceptora wyłącznie do kontrolowanej diagnostyki, zawężaj pointcut i upewnij się, że do logów nie trafiają poufne argumenty ani wartości zwracane.