加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 08:29:51 所属栏目:Java 来源:网络整理
导读:我正在开发一个在JBoss下运行的 Java EE Web应用程序. 我想做以下事情: 当用户发送http请求(通过打开页面或通过AJAX)时,将收集与此请求相关的所有日志,然后将其保存到数据库中.相关的意思是他们在处理当前请求的过程中被记录.最难的部分是收集与单个请求相
我正在开发一个在JBoss下运行的 Java EE Web应用程序.

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

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

JBoss使用log4j进行日志记录.当应用程序启动时,启动侦听器会注册一个log4j appender,它将所有日志收集到ThreadLocal字段中.在请求处理结束时,日志将从字段中获取并保存到DB中.

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

你有什么想法,怎么做?

谢谢,
Artem B.

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读