Я был в проекте, где мне нужно было управлять десятками веб-приложений.Каждое из приложений регистрировалось немного по-разному, и управлять им было довольно сложно.Я использовал стратегию, аналогичную описанной вами для стандартизации в log4j, и она сработала довольно хорошо.
По сути, я создал один файл common.jar, который содержит общий код.Этот jar содержит log4j.xml, который устанавливает уровень журнала в INFO и устанавливает для стандартного приложения appdout для common.jar.Эта конфигурация log4j используется в качестве базовой для всех других приложений.
В этом примере представьте, что этот класс находится внутри common.jar:
public class ThirdPartyLib
{
protected static final Logger log = LogManager.getLogger("third-party-lib");
public void doSomething()
{
log.debug("Third Party App is about to Do something!");
log.info("Third Party App just did something");
}
}
Теперь все другие веб-приложения могут просто зависеть от common.jar.Например, представьте, что этот класс находится внутри myapp.war:
public class MyApp
{
public void CallThirdParty()
{
ThirdPartyLib lib = new ThirdPartyLib();
lib.doSomething();
}
}
Поскольку log4j.xml находится внутри common.jar, этот код будет регистрировать что-то вроде этого.Другими словами, нет необходимости помещать log4j.xml в myapp.war:
2011-01-03 15:49:22,451 [main] INFO third-party-lib - Third Party App just did something
Теперь, если вы хотите / должны контролировать вход в myapp.war, просто поместите log4j.xml внутри myapp..war и переопределить настройки из common.jar.Например, вы можете установить уровень DEBUG, и тогда вы увидите:
2011-01-03 16:03:22,928 [main] DEBUG third-party-lib - Third Party App is about to Do something!
2011-01-03 16:03:22,928 [main] INFO third-party-lib - Third Party App just did something
ОБНОВЛЕНИЕ - Можно ли настроить каждое веб-приложение для входа в отдельный файл?
Да, определенно.Например, вы можете направлять журналы в RollingFileAppender вместо stdout внутри log4j.xml для myapp.war.Это удобно, потому что тогда вы можете хранить каждый отдельный журнал веб-приложения в отдельном файле.
Кроме того, я написал фильтр сервлетов (похожий на предложенный gigadot), который настраивает log4j для проверки того, существует ли log4j.xml на внешнем пути (вне войны каждого веб-приложения).Таким образом, файлы log4j.xml доступны за пределами войн, и мы можем устанавливать уровни журналов, не перезапуская контейнер сервлета (в данном случае tomcat).Если внешний файл log4j.xml не существует, по умолчанию он использует файл log4j.xml для каждого пути к классам приложений.