art*_*emb 3 java logging jboss log4j
我正在开发一个在JBoss下运行的Java EE Web应用程序.
我想执行以下操作:当用户发送http请求(通过打开页面或通过AJAX)时,将收集与此请求相关的所有日志,然后将其保存到数据库中.相关的意思是他们在处理当前请求的过程中被记录.最难的部分是收集与单个请求相关的日志.
我正在研究这个解决方案:
JBoss使用log4j进行日志记录.当应用程序启动时,启动侦听器会注册一个log4j appender,它会将所有日志收集到ThreadLocal字段中.在请求处理结束时,日志将从字段中获取并保存到DB中.
但是,现在看来,log4j appender在其他线程中工作.这使得这个解决方案变得不可能.
你有什么想法,怎么做?
谢谢,Artem B.
您可以使用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)