Como usar o Spring DebugInterceptor para rastreamento AOP


Data de Publicação:

Atualizado:


Artigos > Como usar o Spring DebugInterceptor para rastreamento AOP

Atualização de 2026 e utilização segura

Em resumo: o DebugInterceptor é um interceptor AOP baseado nos proxies do Spring. Regista chamadas de métodos no nível TRACE e deve ser usado em diagnósticos pontuais, não como solução geral de observabilidade em produção.

O que você aprenderá

  • Como um orientador seleciona métodos e anexa o interceptor aos beans Spring elegíveis.
  • Por que a auto-invocação e os objetos criados fora do contêiner Spring podem ignorar os conselhos de proxy.
  • Como evitar a exposição de argumentos, dados pessoais, credenciais ou volume excessivo de registros.

A quem se destina: Desenvolvedores Spring que mantêm um aplicativo configurado em XML ou que aprendem AOP clássico baseado em proxy.

Atualização para 2026: A classe ainda existe na documentação atual do Spring Framework, mas o exemplo XML do Spring 5.1.4 abaixo é histórico. Use uma linha Spring compatível, limite o registro TRACE a diagnósticos controlados e prefira métricas atuais, rastreamento e registro estruturado para operações de produção.

Nota de segurança: os comandos e exemplos de configuração do artigo original não foram novamente executados num ambiente de produção atual. Antes de os aplicar, confirme as versões suportadas, as cópias de segurança, os controlos de acesso e o procedimento de reversão num ambiente de teste isolado.

Fontes primárias oficiais

Visão geral

Este artigo mostra como configurar o DebugInterceptor do Spring para registar, através de AOP, a entrada e a saída dos métodos selecionados. O exemplo complementa a documentação com uma configuração reproduzível em Spring 5.1.4.

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-api

Índice

  1. O que é um DebugInterceptor?
  2. Configuração
  3. Conclusão

1. O que é um DebugInterceptor?

O DebugInterceptor é uma biblioteca que gera registos através de AOP. Este exemplo utiliza os seguintes ficheiros JAR, na versão 5.1.4.

https://mvnrepository.com/artifact/org.springframework/spring-aop/5.1.4.RELEASE

A classe em causa é "org.springframework.aop.interceptor.DebugInterceptor".

A programação orientada a aspetos (AOP) aplica comportamento transversal aos objetos geridos pelo contentor de injeção de dependências do Spring, sem o misturar com a lógica da aplicação.

Neste caso, o DebugInterceptor é associado ao componente criado com @Component.

1-1. ambiente de implementação

Esta secção identifica os ficheiros JAR e as versões utilizadas, pois os detalhes podem variar consoante o ambiente.

Versão do Spring AOPspring-aop-5.1.4.RELEASE.jar
Versão do Spring Beansspring-beans-5.1.4.RELEASE.jar
Bibliotecas de loggingslf4j-api-1.7.25.jar
logback-core-1.2.3.jar

1-2. Trabalho necessário.

O trabalho necessário é o seguinte.

  • Criar uma instância com @Component.
  • Definir AOP na aplicaçãoContext.xml
  • Alteração das definições de saída de registo

2. Configuração

As secções seguintes aplicam os passos a uma classe de demonstração.

2-1. Criar uma instância com @Component.

A classe seguinte é declarada com @Component. O método limita-se a devolver o controlo, para isolar o registo produzido pelo interceptor.

TestAop.java


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

        return;

    }

}

2-2. Definir AOP na aplicaçãoContext.xml

Declare o interceptor e o pointcut em applicationContext.xml. As linhas a vermelho pertencem à configuração 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">
~abridgement~
    <!-- Teste AOP da Primavera. -->
    <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>

A expressão pointcut segue esta forma:

pointcut="execution(* nome do pacote.nome da classe.método-nome(..))"

No exemplo acima, seria o seguinte.

• nome do pacote: com.example

• nome da classe: TestAop

• método-nome: testMethod

Se desejar aplicá-lo a todos os métodos, aplica-se o seguinte.

• pointcut="execution(* com.example.TestAop.*(..))"

2-3. Alteração das definições de saída de registo

Alterar o nível de registo apenas para o DebugInterceptor, uma vez que o nível de saída de registo descrito no DebugInterceptor é "TRACE". As áreas a vermelho são aquelas que precisam de ser definidas. O resto das configurações pode ser introduzido arbitrariamente.

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>

Com spring-aop-5.1.4.RELEASE.jar, o nível DEBUG não inclui estas mensagens: o logger do interceptor tem de aceitar TRACE.

Se o registo não aparecer, verifique o pointcut, a passagem da chamada pelo proxy do Spring e o nível efetivo do logger.

2-4. Resultado.

Se chamar testMethod em TestAop.java com as configurações acima completas, deve ser emitido o seguinte registo. O registo é longo, pelo que apaguei algumas linhas, mas deve produzir duas linhas cada uma para Entrada e Saída, para um total de quatro linhas.

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. Conclusão

Utilize o DebugInterceptor apenas em diagnósticos controlados, limite o pointcut e confirme que argumentos ou valores de retorno sensíveis não são escritos nos logs.

■INFORMATION

Artigos


■PROFILE

Perfil


■Contacto

Contacto