Как Вы дифференцируете log4j сессии в файле журнала из копий того же веб-приложения?

Существует только один файл. И это записано одновременно как выполненные копии веб-приложения.

Как Вы фильтруете только одно сообщение журнала сеанса от других строк журнала?

8
задан EugeneP 4 May 2010 в 08:50
поделиться

4 ответа

Использование фильтра сервлетов с информацией NDC или MDC - лучший способ, который я видел. Быстрое сравнение этих двух доступно на http://wiki.apache.org/logging-log4j/NDCvsMDC .

Я обнаружил, что в прошлом MDC работал для меня лучше. Помните, что вам необходимо обновить файл свойств log4j, включив в него ту версию, которую вы предпочитаете (определения шаблонов на http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html ).

Полный пример настройки MDC с фильтром сервлетов доступен по адресу http://veerasundar.com/blog/2009/11/log4j-mdc-mapped-diagnostic-context-example-code/ .

Немного проще настроить, но значительно хуже: вы можете просто распечатать идентификатор потока (через файл свойств) для каждого запроса и убедиться, что первое, что вы регистрируете о каждом запросе, - это идентификатор сеанса. Это не так хорошо (или полезно), но может работать для приложений с небольшим объемом.

13
ответ дан 5 December 2019 в 07:34
поделиться

Если вы хотите различать сессии в одном и том же приложении, то MDC - это то, что вам нужно. Но если вы хотите разграничить веб-приложения, пишущие в один и тот же файл, то MDC не поможет, потому что он работает на основе потоков. В таком случае я использовал собственный аппендер, который знает, какой экземпляр приложения он обслуживает. Это можно сделать через свойства конфигурации аппендера. Такой аппендер будет вставлять имя приложения в каждое событие логирования как свойство перед записью в медиа, а затем вы можете использовать макет для отображения значения этого свойства в текстовом файле, в который оно записывается. Использование MDC в таком случае не сработает, потому что каждый поток должен будет MDC.put(applicationName), а это довольно некрасиво. MDC подходит только для одного процесса, но не для нескольких. Если кто-то знает другой способ, я был бы рад услышать.

1
ответ дан 5 December 2019 в 07:34
поделиться

Вы можете установить контекстное сообщение, включая идентификатор конкретного экземпляра приложения, используя org.apache.log4j.NDC , например:

String appInstanceId = "My App Instance 1";
org.apache.log4j.NDC.push(appInstanceId);
// handle request
org.apache.log4j.NDC.clear();

Вы можете настроить контекст во время инициализации экземпляра вашего веб-приложения или внутри метода doPost () ваших сервлетов. Как следует из названия, вы также можете вкладывать контексты в контексты с помощью нескольких вызовов push на разных уровнях.

См. Раздел «Вложенные диагностические контексты» в руководстве Log4J .

6
ответ дан 5 December 2019 в 07:34
поделиться

Вот страница, которая устанавливает MDC фильтр для web-приложения -> http://rtner.de/software/MDCUserServletFilter.html

Будучи фильтром сервлетов, он освободит вас от управления MDC/NDC в каждом из ваших сервлетов.

Конечно, вы должны модифицировать его, чтобы сохранить информацию, более подходящую для вашего web-приложения.

2
ответ дан 5 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: