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?
  2. Konfiguracja
  3. Podsumowanie

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 AOPspring-aop-5.1.4.RELEASE.jar
Wersja Spring Beansspring-beans-5.1.4.RELEASE.jar
Biblioteki logowaniaslf4j-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.

TestAop.java


@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.

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">
~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.

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>

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.

■INFORMATION

Artykuły


■PROFILE

Profil


■Kontakt

Kontakt