gpt4 book ai didi

java - 为基于 Spring 的 Web 应用程序中的每个请求分配一个唯一的 ID

转载 作者:IT老高 更新时间:2023-10-28 13:53:14 26 4
gpt4 key购买 nike

我创建了一个基于 Spring 的 Java Web 应用程序,

对于每个请求,将创建一个“ Controller 类”的实例来处理请求。

在业务逻辑中,我想使用自动分配给每个请求的唯一 ID 进行一些日志记录,以便我可以跟踪程序到底做了什么。

日志可能是这样的(同时2个请求):

[INFO] request #XXX: begin.
[INFO] request #XXX: did step 1
[INFO] request #YYY: begin.
[INFO] request #XXX: did step 2
[INFO] request #YYY: did step 1
[INFO] request #XXX: end.
[INFO] request #YYY: end.

从日志中,我可以意识到:请求 #XXX:开始-步骤 1-步骤 2-结束req #YYY: begin-step1-end

我希望在代码中的任何地方都可以轻松调用日志记录,所以我不想给每个java函数都加一个“requestId”的参数,

如果日志工具可以静态调用就完美了:

LOG.doLog("did step 1");

知道我该怎么做吗?谢谢你:)

最佳答案

您也可以尝试使用 MDC Log4j 类。 MDC 基于每个线程进行管理。如果您使用的是 ServletRequestListner,那么您可以在 requestInitialized 中设置唯一 Id。

import org.apache.log4j.MDC;
import java.util.UUID;

public class TestRequestListener implements ServletRequestListener {
protected static final Logger LOGGER = LoggerFactory.getLogger(TestRequestListener.class);

public void requestInitialized(ServletRequestEvent arg0) {
LOGGER.debug("++++++++++++ REQUEST INITIALIZED +++++++++++++++++");

MDC.put("RequestId", UUID.randomUUID());

}

public void requestDestroyed(ServletRequestEvent arg0) {
LOGGER.debug("-------------REQUEST DESTROYED ------------");
MDC.clear();
}
}

现在在代码中的任何位置,如果您执行调试、警告或错误日志。您在 MDC 中放入的任何内容都将被打印出来。您需要配置 log4j.properties。注意 %X{RequestId}。这里指的是上面 requestInitialized() 中插入的键名。

log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSSS} %p %C %X{RequestId} - %m%n

我还发现此链接很有帮助 -> What is the difference between Log4j's NDC and MDC facilities?

关于java - 为基于 Spring 的 Web 应用程序中的每个请求分配一个唯一的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18823241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com