在Spring AOP周围建议中拦截log4j2的ThreadContext

时间:2017-08-03 13:13:04

标签: java spring spring-boot log4j2 spring-aop

  • 我有一个spring web-app,它从UI接收一些URI请求,并调用Service类中的业务逻辑来执行某个操作。

以下是我如何使用的快照:

log4j配置:

<Appenders>
        <Jdbc ignoreExceptions="true" name="db-appender"
        bufferSize="${env:LOG_DB_BUFFER_SIZE}" tableName="test.&quot;LOGS&quot;">
        <ConnectionFactory class="com.pritam.logging.ConnectionFactory" method="getDatabaseConnection" />
        <Column name="dated" isUnicode="false" isEventTimestamp="true" />
        <Column name="logger" isUnicode="false" pattern="%logger" />
        <Column name="level" isUnicode="false" pattern="%level" />
        <Column name="message" isUnicode="false" pattern="%message" />
        <Column name="exception" isUnicode="false" pattern="%ex{full}" />
        <Column name="session_id" isUnicode="false" pattern="%X{session_id}"/>
    </Jdbc>
</Appenders>

示例方法:

public void doSomething(String id, JobHeader jobHeader) {
    ThreadContext.put("session_id", jobHeader.getContext().getSessionId());

    //Business Logic
    logger.debug("Logging Message");
    //Business Logic

    ThreadContext.clearAll();        
}

这很好用。并将会话ID记录在不同的列中。

现在,我有n个 doSomething 方法,这些方法将在具有各种session-id的独立线程中执行。 而且我不想一遍又一遍地写ThreadContext语句,所以我想考虑使用Spring-AOP建议(@Around Advice)来完成这项任务。

有人可以向我解释如何在Spring-AOP中的@Around建议中注入ThreadContext。

谢谢

1 个答案:

答案 0 :(得分:0)

我在这些方面做了些什么

说我有一个组件

@Component
public class MyService { 
    public void doSomething() { ... } 
}

然后我定义为它的方面:

@Component
@Aspect
public class MyServiceAspect { 
    @Before("execution(* <packages>.MyService.doSomething())")
    public void beforeDoSomething() {
        ThreadContext.put("key", "value");
    }

    @After("execution(* <packages>.MyService.doSomething())")
    public void afterDoSomething() {
        ThreadContext.clearAll(); 
    }
}

希望有所帮助