Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在jboss中收集与单个请求相关的日志?_Java_Logging_Jboss_Log4j - Fatal编程技术网

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

Java 如何在jboss中收集与单个请求相关的日志?,java,logging,jboss,log4j,Java,Logging,Jboss,Log4j,我正在开发一个在JBoss下运行的JavaEEWeb应用程序 我想做以下工作: 当用户发送http请求(通过打开页面或通过AJAX)时,将收集与此请求相关的所有日志,然后将其保存到数据库中。我所说的相关是指在处理当前请求的过程中记录它们。最困难的部分是收集与单个请求相关的日志 我正在研究这个解决方案: JBoss使用log4j进行日志记录。当应用程序启动时,启动侦听器注册一个log4j appender,该appender将所有日志收集到一个ThreadLocal字段中。在处理请求的最后,从字段

我正在开发一个在JBoss下运行的JavaEEWeb应用程序

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

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

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

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

你知道怎么做吗

谢谢, Artem B.

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

我经常使用它将会话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}] ...

也许我遗漏了一些东西,但是你能不能把一些log4j调用放在传入请求访问的servlet中?问题是请求是由许多无状态EJB处理的。在处理过程中,他们都记录了一堆有用的东西——这就是我想要收集到单个位置然后存储到数据库的东西