配置log4j2线程上下文

时间:2017-01-15 11:13:34

标签: java spring logging log4j log4j2

在我的春季启动应用程序中,我正在使用log4j2。这是一个典型的Web应用程序。我有很多连接,我想为每个连接分开日志。

我想使用Thread Context

@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() throws InterruptedException
{
    try (final CloseableThreadContext.Instance ctc = CloseableThreadContext.push(UUID.randomUUID().toString()))
    {

        logger.info("start");
        Thread.sleep(1000);
        logger.info("end.");
    }
    return "response";
}

我正在两个终端进行测试:curl localhost:8000/test。但我有结果:

14:09:27.895 [qtp401792389-21] INFO  Controllers.ContentController - start
14:09:28.062 [qtp401792389-19] INFO  Controllers.ContentController - start
14:09:28.896 [qtp401792389-21] INFO  Controllers.ContentController - end.
14:09:29.062 [qtp401792389-19] INFO  Controllers.ContentController - end.

这是会议的混合,我想要这个:

14:09:27.895 [qtp401792389-21] INFO  Controllers.ContentController - start
14:09:28.896 [qtp401792389-21] INFO  Controllers.ContentController - end.
14:09:28.062 [qtp401792389-19] INFO  Controllers.ContentController - start
14:09:29.062 [qtp401792389-19] INFO  Controllers.ContentController - end.

那么,这有什么特殊的配置吗?

2 个答案:

答案 0 :(得分:1)

Log4j2 FAQ has an example,了解如何使用RoutingAppender根据ThreadContext键将日志路由到不同的文件。

这使用ThreadContext映射,而不是堆栈(因此您需要使用put方法而不是push)。

答案 1 :(得分:0)

有点晚了,但如果你使用ThreadContext.put(key, value)的MDC实现更好。使用正确的配置非常重要,例如{%20X}.