Как вы отличаете сеансы log4j в файле журнала от копий одного и того же веб-приложения? - PullRequest
8 голосов
/ 04 мая 2010

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

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

Ответы [ 4 ]

13 голосов
/ 04 мая 2010

Использование фильтра сервлетов с информацией 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/.

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

6 голосов
/ 04 мая 2010

Вы можете установить контекстное сообщение, включая идентификатор конкретного экземпляра приложения, используя 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 .

2 голосов
/ 04 мая 2010

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

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

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

1 голос
/ 04 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...