3

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

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

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

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

但是,现在看来,log4j 附加程序在其他线程中工作。这使得这个解决方案是不可能的。

你有什么想法,这是怎么做到的?

谢谢,Artem B.

4

1 回答 1

7

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

我经常使用它来将会话 ID 添加到日志输出中,以用于该会话的任何日志记录:

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}] ...
于 2009-04-23T14:39:51.293 回答