LOG4J, как одиночка, во всяком случае, чтобы избежать конфликтов журнала log4j в веб-среде - PullRequest
3 голосов
/ 04 ноября 2010

У нас есть веб-среда j2ee.Сервер настроен на совместное использование сеанса и, возможно, загрузчиков классов в нескольких веб-приложениях.По сути, один загрузчик классов может обслуживать несколько веб-приложений.

Кажется, это вызывает проблемы с log4j.Разные веб-приложения могут иметь разные конфигурации log4j, но регистрация будет перемещаться в один и тот же файл.

При чтении в Интернете, похоже, что log4j часто использует синглтоны в терминах appenders и других функций.Есть ли способ полностью отделить конфигурации log4j от одного веб-приложения от другого.

Сервер: websphere6 +
Log4j: 1.4.2
Java: 1.5

Example log4j.properties (webapp1):

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=/usr/local/file1.log
log4j.additivity.com.app=false

Example log4j.properties (webapp2):

log4j.appender.Z=org.apache.log4j.RollingFileAppender
log4j.appender.Z.File=/usr/local/file2.log
log4j.additivity.com.app=false

Rightтеперь регистрация в webapp2 может появляться в журналах webapp1 и наоборот.Мы не хотим этого.

Возможное решение:

  • Возможно, можно добавить пользовательский файл appender?Устранит ли это проблему и какой код я добавлю к пользовательскому приложению?

  • Можно ли изменить инициализацию log4j.Например, могу ли я использовать какой-нибудь загрузочный сервлет для загрузки logj4 для каждого веб-приложения.

1 Ответ

2 голосов
/ 04 ноября 2010

У вас есть два способа решения вашей проблемы:

  1. Настройте ваше приложение.сервер, поэтому он не разделяет загрузчики классов между несколькими веб-приложениями.Когда это происходит, из-за природы log4j будет загружен только один файл log4j.properties.

  2. Если вы покинете приложение.сервер, так что он разделяет загрузчики классов, затем используйте один «главный» файл log4j.properties.В нем определите appenders для root каждого из ваших приложений (например, com.mycompany.webapp1, com.mycompany.webapp2)

Ни одно решение не является идеальным.В частности, второй будет проблематичным, если ваши веб-приложения будут использовать некоторые классы, использующие log4j.В этом случае журналы обоих приложений будут заканчиваться в одном файле.

Ваша проблема является распространенной.Чтобы узнать больше об этой теме, поищите в Google «log4j and j2ee».

Редактировать: , поскольку решения 1 и 2 невозможны, вы можете попробовать что-то другое:

  • Используйте файл log4j.properties для каждого приложения.В каждом из них определите appender для своего корня (как описано в решении 2) и установите аддитивность в false.Это также не будет идеальным, если между ними существует какой-либо общий класс.

  • Программируйте log4j для каждого приложения.Поскольку это устаревшие приложения, это может быть сложно.Один из способов сделать это - использовать ServletContextListener для каждого приложения и настроить log4j при запуске приложения.Я лично не пробовал это, поэтому я не уверен на 100%, будут ли конфликты из-за общих загрузчиков классов.

Log4j больше не будет обновляться.Чеки Гюльчу, который создал log4j, заявил, что он сосредоточит свои усилия на slf4j и logback , чтобы исправить некоторые ошибки, которые он сделал во время разработки log4j.

...