首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Spring中拦截ThreadContext of log4j2

在Spring中拦截ThreadContext of log4j2
EN

Stack Overflow用户
提问于 2017-08-03 13:13:04
回答 1查看 1.8K关注 0票数 1
  • 我有一个spring应用程序,它接收来自UI的一些URI请求,并在Service类中调用业务逻辑来执行特定的操作。
代码语言:javascript
运行
复制
- I'm using log4j2 JDBC logging to log in Database.
- Now I want to log session-Id in a different column in Database. And for this, I'm using ThreadContext Map to pass session-Id to be saved as mentioned here: [https://logging.apache.org/log4j/2.x/manual/thread-context.html](https://logging.apache.org/log4j/2.x/manual/thread-context.html)

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

log4j配置:

代码语言:javascript
运行
复制
<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>

抽样方法:

代码语言:javascript
运行
复制
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方法,它们将在具有各种会话I的独立线程中执行。而且我不想一遍又一遍地写ThreadContext语句,所以我考虑在这个任务中使用Spring建议(@Around通知)。

请有人向我解释一下,如何在Spring中插入@ ThreadContext的建议。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-15 18:27:35

我做了一些事情

假设我有一个组件

代码语言:javascript
运行
复制
@Component
public class MyService { 
    public void doSomething() { ... } 
}

然后,我将其定义为方面:

代码语言:javascript
运行
复制
@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(); 
    }
}

希望它能帮上忙

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45485264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档