【问题标题】:Configuration of log4j2 Thread Contextlog4j2 线程上下文的配置
【发布时间】:2017-01-15 11:13:33
【问题描述】:

在我的 Spring Boot 应用程序中,我使用的是 log4j2。这是一个典型的网络应用程序。我有很多连接,我想为每个连接分开日志。

我想用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.

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

【问题讨论】:

    标签: java spring logging log4j log4j2


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      有点晚了,但最好使用带有ThreadContext.put(key, value) 的MDC 实现。使用正确的配置很重要,比如{%20X}.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-18
        • 2017-05-24
        • 1970-01-01
        • 2017-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-06
        相关资源
        最近更新 更多