Как собирать логи в jboss, связанные с одним запросом? - PullRequest
3 голосов
/ 23 апреля 2009

Я занимаюсь разработкой веб-приложения Java EE, работающего под управлением JBoss.

Я хочу сделать следующее: Когда пользователь отправляет запрос http (открывая страницу или через AJAX), все журналы, связанные с этим запросом, собираются и затем сохраняются в базе данных. Под связанными я подразумеваю, что они регистрируются в процессе обработки текущего запроса. Самым сложным является сбор журналов, связанных с одним запросом.

Я искал это решение:

JBoss использует log4j для ведения журнала. Когда приложение запускается, слушатель запуска регистрирует приложение log4j, которое собирает все журналы в поле ThreadLocal. В конце обработки запроса журналы берутся из поля и сохраняются в БД.

Но, похоже, теперь приложения log4j работают в других потоках. Это делает это решение невозможным.

У вас есть идеи, как это можно сделать?

Спасибо, Артем Б.

1 Ответ

7 голосов
/ 23 апреля 2009

Вы можете использовать log4j класс MDC (сопоставленный диагностический контекст), чтобы связать определенные данные с текущим потоком.

Я часто использую это для добавления идентификатора сеанса в выходной файл журнала для любого ведения журнала для этого сеанса:

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);
            }   

            ...

Тогда вы просто ссылаетесь на MDC по ключу в вашем PatternLayout. Не уверен, как работает аппендификатор БД, но я предполагаю, что он может также регистрировать поля MDC ...

log4j.appender.LOGFILE.layout.ConversionPattern= ... [SessionID=%X{SessionID}] ...
...