Java 如何在jboss中收集与单个请求相关的日志?
我正在开发一个在JBoss下运行的JavaEEWeb应用程序 我想做以下工作: 当用户发送http请求(通过打开页面或通过AJAX)时,将收集与此请求相关的所有日志,然后将其保存到数据库中。我所说的相关是指在处理当前请求的过程中记录它们。最困难的部分是收集与单个请求相关的日志 我正在研究这个解决方案: JBoss使用log4j进行日志记录。当应用程序启动时,启动侦听器注册一个log4j appender,该appender将所有日志收集到一个ThreadLocal字段中。在处理请求的最后,从字段中获取日志并保存到数据库中 但是,现在看来,log4j appender可以在其他线程中工作。这使得这个解决方案不可能 你知道怎么做吗 谢谢, Artem B.您可以使用log4j(映射的诊断上下文)将某些数据与当前线程关联 我经常使用它将会话ID添加到日志输出中,以便记录该会话的日志:Java 如何在jboss中收集与单个请求相关的日志?,java,logging,jboss,log4j,Java,Logging,Jboss,Log4j,我正在开发一个在JBoss下运行的JavaEEWeb应用程序 我想做以下工作: 当用户发送http请求(通过打开页面或通过AJAX)时,将收集与此请求相关的所有日志,然后将其保存到数据库中。我所说的相关是指在处理当前请求的过程中记录它们。最困难的部分是收集与单个请求相关的日志 我正在研究这个解决方案: JBoss使用log4j进行日志记录。当应用程序启动时,启动侦听器注册一个log4j appender,该appender将所有日志收集到一个ThreadLocal字段中。在处理请求的最后,从字段
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处理的。在处理过程中,他们都记录了一堆有用的东西——这就是我想要收集到单个位置然后存储到数据库的东西