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

art*_*emb 3 java logging jboss log4j

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

我想执行以下操作:当用户发送http请求(通过打开页面或通过AJAX)时,将收集与此请求相关的所有日志,然后将其保存到数据库中.相关的意思是他们在处理当前请求的过程中被记录.最难的部分是收集与单个请求相关的日志.

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

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

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

你有什么想法,怎么做?

谢谢,Artem B.

mat*_*t b 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);
            }   

            ...
Run Code Online (Sandbox Code Playgroud)

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

log4j.appender.LOGFILE.layout.ConversionPattern= ... [SessionID=%X{SessionID}] ...
Run Code Online (Sandbox Code Playgroud)