繁体   English   中英

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

[英]How to collect logs in jboss related to a single request?

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

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

我正在研究此解决方案:

JBoss使用log4j进行日志记录。 应用启动时,启动侦听器将注册一个log4j附加程序,该附加程序将所有日志收集到ThreadLocal字段中。 在请求结束时,将从字段中获取日志,并将其保存到DB中。

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

您有什么想法,如何实现?

谢谢,ArtemB。

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

我经常使用该命令将Session 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。 不知道数据库附加程序如何工作,但我认为它也可以记录MDC字段...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM