gpt4 book ai didi

java - jboss中如何收集与单个请求相关的日志?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:36:49 25 4
gpt4 key购买 nike

我正在开发一个在 JBoss 下运行的 Java EE 网络应用程序。

我想做以下事情:当用户发送 http 请求(通过打开页面或通过 AJAX)时,所有与此请求相关的日志都会被收集,然后保存到数据库中。相关的意思是它们在处理当前请求的过程中被记录下来。最难的部分是收集与单个请求相关的日志。

我正在研究这个解决方案:

JBoss 使用 log4j 进行日志记录。当应用程序启动时,启动监听器会注册一个 log4j 附加程序,该附加程序将所有日志收集到 ThreadLocal 字段中。在处理请求的最后,日志从现场获取并保存到数据库中。

但是,现在看来,log4j appender 在其他线程中工作。这使得该解决方案变得不可能。

你知道怎么做吗?

谢谢,Artem B.

最佳答案

您可以使用 log4j MDC class (映射诊断上下文)将某些数据与当前线程相关联。

我经常使用它来将 session ID 添加到日志输出中,以了解该 session 正在进行的任何日志记录:

public class AddSessionIdToLogFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
ServletException {

if (request instanceof HttpServletRequest) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String sessionID = httpRequest.getSession().getId();

MDC.put("SessionID", sessionID);
}

...

然后您只需在 PatternLayout 中通过键引用 MDC。不确定 DB appender 是如何工作的,但我认为它也可以记录 MDC 字段......

log4j.appender.LOGFILE.layout.ConversionPattern= ... [SessionID=%X{SessionID}] ...

关于java - jboss中如何收集与单个请求相关的日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/781817/

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