[英]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.