Для приложения, которое развертывается на большом количестве машин, я решил развернуть стандартный файл log4j.xml с пакетом приложения, просто чтобы убедиться, что одинаковые настройки присутствуют везде: приложения, категории, уровни.

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

Как я могу переопределить уровни log4j, не изменяя исходный файл log4j.xml?

4
Robert Munteanu 18 Ноя 2009 в 15:02

3 ответа

Лучший ответ

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

Взгляните на здесь, чтобы получить дополнительную информацию:

1
Trevor Tippins 18 Ноя 2009 в 15:27

Установите переменную среды log4j.configuration так, чтобы она указывала на внешний файл. Таким образом, при повторном развертывании внешний файл не будет затронут или изменен, и, следовательно, ваша конфигурация не будет потеряна.

Для справки см. Раздел Процедура инициализации по умолчанию в руководство по log4j.

2
matt b 18 Ноя 2009 в 15:09
Итак, вы предлагаете скопировать файл, а затем указать приложение (временно) на новый файл?
 – 
Robert Munteanu
18 Ноя 2009 в 15:11
Я предлагаю хранить ваши настройки log4j в каталоге, который находится за пределами вашего сервера приложений, чтобы вам не приходилось беспокоиться о потере изменений во время повторного развертывания или отмены развертывания, а также использовать переменную среды log4j.configuration, чтобы сообщить log4j, где находится файл является. Ничего "временного" в этом нет.
 – 
matt b
18 Ноя 2009 в 15:17
Другими словами, переопределите поведение поиска по умолчанию (пути к классам webapps, который представляет собой WEB-INF / classes, общую библиотеку сервера приложений и т. Д.), Задав путь самостоятельно.
 – 
matt b
18 Ноя 2009 в 15:17
Теперь я понимаю. Моя проблема в том, что мне нужен файл по умолчанию с небольшими временными изменениями.
 – 
Robert Munteanu
18 Ноя 2009 в 15:45

Раньше я решал такие проблемы, вводя еще одно косвенное обращение в файл свойств log4j. Например, указав как

log4j.appender.CONSOLE.Threshold = %level%.

Во время выполнения первое, что я делал, это заменял заполнители в памяти или придерживался значений по умолчанию. Таким образом, конфигурация log4j никогда не менялась на протяжении всех развертываний, включая разработчиков, QA и даже производство. У каждой цели будет свой основной набор параметров конфигурации, среди которых будут% заполнители% для уровня. Эти параметры будут либо приходить с установщиком, либо каждый пользователь сохранит основную конфигурацию в стороне при загрузке новой версии для работы. Но конфигурация log4j никогда не меняется и ее никто не трогает, кроме разработчиков, которые непосредственно этим занимаются.

Возможно, мое объяснение слишком сложное ... подумайте об этом как о Spring PropertyPlaceholderConfigurer и примените его к конфигурации log4j :)

Это немного кодирования, но оно действительно простое и решает множество проблем в будущем.

1
Dima 18 Ноя 2009 в 20:17