Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat classloader: как его забороть? / 13 сообщений из 13, страница 1 из 1
17.03.2017, 11:50
    #39421354
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
Поясните вкратце как работает класслоадер в томкате?
На Jboss-е привык, что он иерархический, соответственно, приложения могут включать одни и те же библиотеки, разных версий, и конфликт не возникает. На томкате задеплоил 2 приложения, в которых включен log4j (1.2.x) и получил конфликт. Ну и всякие удивительные вещи, если в этих приложениях аппендеры с одинаковыми именами
...
Рейтинг: 0 / 0
17.03.2017, 12:08
    #39421381
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
ivanra,
а размещение всего и вся в одном месте где приложение, а не либы сервера не помогает?
...
Рейтинг: 0 / 0
17.03.2017, 12:11
    #39421388
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
ivanra,

https://wiki.apache.org/tomcat/FAQ/Logging#Q5 How should I log in my own webapps?

While you can use System.out and System.err to log, we strongly recommend using a toolkit like Log4J or JDK 1.4's java.util.logging package. With these toolkits, you have significantly more functionality. For example, sending emails, logging to a database, controlling at runtime the logging level of different classes, inspecting the logs with a graphical viewer, etc.

We also recommend that you separate your logging from Tomcat's internal logging. That means you should bundle your logging toolkit with your webapp. If you are using Log4J, for example, place the Log4J jar in the WEB-INF/lib directory of your webapp and the Log4J configuration file in the WEB-INF/classes directory of your webapp . This way different web applications can have different logging configurations and you don't need to worry about them interfering with each other.
...
Рейтинг: 0 / 0
17.03.2017, 12:30
    #39421408
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
Usman,
Тоже думал, что так можно, а оказывается нет. Если включаю log4j в оба приложения, одно из них загружается, а во втором ошибка:
Код: powershell
1.
2.
3.
4.
5.
log4j:ERROR A "org.apache.log4j.ConsoleAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
log4j:ERROR The class "org.apache.log4j.Appender" was loaded by 
log4j:ERROR [sun.misc.Launcher$AppClassLoader@33b503] whereas object of type 
log4j:ERROR "org.apache.log4j.ConsoleAppender" was loaded by [WebappClassLoader
... тут указывает на лоадер того приложения, которому не повезло


ну а если кладу log4j в lib, а в приложениях указываю <scope>provided</scope> то происходит интерференция конфигураций
...
Рейтинг: 0 / 0
17.03.2017, 12:30
    #39421411
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
ivanraПоясните вкратце как работает класслоадер в томкате? Дык ... .
Иерархический, но без изоляции. Соответственно, "глобальные вещи" выносим в {catalina.base}/lib или даже в системный загрузчик.
Если log4j, то лучше настроить на него самого котяру и "покласть" jar-ник туда, куда удобнее скрипту запуска.
...
Рейтинг: 0 / 0
17.03.2017, 13:48
    #39421481
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
Насколько мне изменяет склероз и беглое чтение документации, в отличии от ДикойМухи (с изоляцией) у вас получится не две конфигурации log4j, а одна, но параметризованная (специальными) свойствами ${engine}, ${host}, ${context} и другими, если они вам понадобятся.

P.S. В своё время я сделал так, что все котяры в кластере использовали собственный номер порта для AJP-коннектора.
Этот номер задавался в скрипте запуска стандартным:
Код: plaintext
 java ... -Dпрефикс.port="####" ...
а server.xml со товарищи использовали ${префикс.port} для получения разных engine и jvm.route (для индейца во фронте).
Дальше "котовья магия" делала подстановку и после запуска из одного файла получалось много конфигураций, где не пересекалось ничего из нужного: у каждой JVM (приложения в JVM) собственные temp, логи и каталоги для них и т.д. и т.п.
Т.е. весь кластер можно было запустить на одном хосте и он работал без каких-либо проблем.
...
Рейтинг: 0 / 0
17.03.2017, 14:57
    #39421582
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
Попытаюсь объяснить что нужно.
Имеется 2 приложения app1 и app2. Хочется, чтобы логи от них писались в разные файлы. Причем, интересует только логи из ru.mydomain.
Вот такие log4j.properties
app1
Код: powershell
1.
2.
3.
4.
log4j.logger.ru.mydomain = INFO, R-app1
log4j.additivity.ru.mydomain = false
log4j.appender.R-app1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.R-app1.File = ${catalina.base}/logs/app1.log


app2
Код: powershell
1.
2.
3.
4.
log4j.logger.ru.mydomain = INFO, R-app2
log4j.additivity.ru.mydomain = false
log4j.appender.R-app2 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.R-app2.File = ${catalina.base}/logs/app2.log


То есть, теоретически, app1 должно писать в log1, app2 - в log2
А фактически на сервере tomcat-7 происходит следующее

- если log4j.jar добавлять в приложения, то логирование работает в том, которое успело задеплоится первым, во втором ошибка как я описал выше. Несмотря на заверения документации.
- если log4j положить в lib, то создаются оба файла .log, но весь вывод идет в один из них (насколько я понимаю, в лог приложения, которое задеплоилось последним). Интерференция по ru.mydomain

Что делать?
...
Рейтинг: 0 / 0
17.03.2017, 16:16
    #39421708
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
Выяснилось: в classpath сервера лежит еще один log4j, и его трогать нельзя (используется специфическими библиотеками). Придется, видимо, логгировать ru.mydomain без использования log4j. Документация сервера не врала.
...
Рейтинг: 0 / 0
17.03.2017, 16:57
    #39421759
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
ivanraЧто делать?
ну был вроде этот вопрос про логи в разные файлы.
Поищи.
...
Рейтинг: 0 / 0
17.03.2017, 18:14
    #39421834
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
ivanraТо есть, теоретически, app1 должно писать в log1, app2 - в log2
А фактически на сервере tomcat-7 происходит следующееЯ же говорю - log4j.xml (лучше - xml) должен быть один и предусматривать настройки всех приложений (контекстов), развёрнутых на сервере.
Котяра создаёт категории вида :
Код: plaintext
 org.apache.catalina.core.ContainerBase.[движок].[хост].[контекст]
По умолчанию будет:
Код: plaintext
 org.apache.catalina.core.ContainerBase.[Catlina].[localhost].[контекст]
Т.е. вы дописываете в имеющуюся конфигурацию ещё два аппендера (с разными файлами) и цепляете каждый на свою категорию.

Если я всё правильно помню, то спецсвойства ${engine}, ${host} и ${context} упрощают работу, т.к. котяра сам развёрнёт ${context} в разные значения для разных приложений - просто используем ${context} в имени файла.
...
Рейтинг: 0 / 0
17.03.2017, 18:16
    #39421836
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
ivanraВыяснилось: в classpath сервера лежит еще один log4j, и его трогать нельзя"Ох уж эти сказочки, ох уж эти сказочники".
Аккуратно добавили свой блок. Естественно, договорившись о мирном сосуществовании.
...
Рейтинг: 0 / 0
17.03.2017, 18:54
    #39421851
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
ivanra,

Посмотрите в сторону slf4j (это на будущее)

- https://www.slf4j.org/legacy.html
- slf4j официально (возможно пока ) не поддерживает только jboss-logging
...
Рейтинг: 0 / 0
17.03.2017, 19:42
    #39421881
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat classloader: как его забороть?
Usman,
как раз slf4j и используется в качестве фасада, а биндинг на log4j (slf4j-log4j12). Заменю его, наверно, на logback-classic, надо только конфиги переделать
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat classloader: как его забороть? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]