在SpringAOP Around Advice中拦截log4j2的ThreadContext
Intercept ThreadContext of log4j2 in Spring AOP Around Advice
我有一个 spring 网络应用程序,它从 UI 接收一些 URI 请求并调用服务 类 中的业务逻辑来执行特定操作。
- 我正在使用 log4j2 JDBC 登录数据库。
- 现在我想在数据库的不同列中记录会话 ID。为此,我使用 ThreadContext Map 传递要保存的会话 ID,如下所述:https://logging.apache.org/log4j/2.x/manual/thread-context.html
下面是我使用方法的快照:
log4j 配置:
<Appenders>
<Jdbc ignoreExceptions="true" name="db-appender"
bufferSize="${env:LOG_DB_BUFFER_SIZE}" tableName="test."LOGS"">
<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 方法,它们将在具有各种会话 ID 的独立线程中执行。
而且我不想一遍又一遍地编写 ThreadContext 语句,所以我正在考虑使用 Spring-AOP 建议(@Around Advice)来完成此任务。
有人可以向我解释如何在 Spring-AOP 中的 @Around 建议中注入 ThreadContext。
谢谢
我按照这些思路做了一些事情
假设我有一个组件
@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();
}
}
希望对您有所帮助
我有一个 spring 网络应用程序,它从 UI 接收一些 URI 请求并调用服务 类 中的业务逻辑来执行特定操作。
- 我正在使用 log4j2 JDBC 登录数据库。
- 现在我想在数据库的不同列中记录会话 ID。为此,我使用 ThreadContext Map 传递要保存的会话 ID,如下所述:https://logging.apache.org/log4j/2.x/manual/thread-context.html
下面是我使用方法的快照:
log4j 配置:
<Appenders>
<Jdbc ignoreExceptions="true" name="db-appender"
bufferSize="${env:LOG_DB_BUFFER_SIZE}" tableName="test."LOGS"">
<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 方法,它们将在具有各种会话 ID 的独立线程中执行。 而且我不想一遍又一遍地编写 ThreadContext 语句,所以我正在考虑使用 Spring-AOP 建议(@Around Advice)来完成此任务。
有人可以向我解释如何在 Spring-AOP 中的 @Around 建议中注入 ThreadContext。
谢谢
我按照这些思路做了一些事情
假设我有一个组件
@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();
}
}
希望对您有所帮助