Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> slf4j static linking 
:(
    Опции темы
gelo86
Дата 26.3.2010, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 388
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Многие столкнулись с проблемой commons-logging и log4j в tomcat. Проблемы проицходят изза class loader'ов (http://articles.qos.ch/classloader.html). Есть такая штука как slf4j. Она типа ресолвит логгеры статически (static linking). Так вот вопрос, что имеется в виду как говорится о static linking ?
PM MAIL   Вверх
jk1
Дата 26.3.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 5
Всего: 75



Цитата

Slf4j uses static linking: one simply select a jar, and sticks it into the classpath - there are a bunch of such jars available. Commons logging uses runtime dynamic classloader lookups. The latter, "clogging", is prone to devious problems when being used with intense classloader-rich systems, like a servlet container (not relevant here), or in an OSGi environment (very relevant). SLF4j was created to overcome this problem by simply being statically linked.


Под static linking понимается тот факт, что будет использован тот логгер, который вы положите в CLASSPATH. Если там лежит slf-simple, то вы получите вывод в System.out, если slf-log4j, то будет использован log4j и т. д.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
gelo86
Дата 27.3.2010, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 388
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Да но, если будет использоватся log4j, то почему теряется проблема classloaderа ? log4j как я понимаю дальше будет загружатся как обычно. Да и при том если не испльзовать slf, то ведь все джары тоже в CLASSPATH лежат, но потом оказывается что есть проблемы с classloaderми.
PM MAIL   Вверх
jk1
Дата 30.3.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 5
Всего: 75



Цитата

то почему теряется проблема classloaderа ? 

потому что самого log4j (для примера) в CLASSPATH может и не быть, а если он будет, то абсолютно неважно какой он был загружен динамически. На самом деле логгирование будут осуществлять классы slf4j-log4j с использованием предложенного log4j конфига.

На самом деле это оказалось не так, см. пост ниже


Это сообщение отредактировал(а) jk1 - 1.4.2010, 23:38


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
gelo86
Дата 1.4.2010, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 388
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



разве будет исполнаться логгированиэ если в CLASSPATH небудет log4.jar ? в самом slf4j нету ведь парсера log4j конфига да и инициализатора, там толка так сказать адаптары к другому фрамеворку по логировании.
PM MAIL   Вверх
jk1
Дата 1.4.2010, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 5
Всего: 75



Цитата

разве будет исполнаться логгированиэ если в CLASSPATH небудет log4.jar

Действительно, я был неправ.

Вопрос оказался весьма интересным и вот что удалось найти:

Как известно, полиморфизм в Java реализован посредством позднего или, как иногда пишут, dynamic-связывания. На нем работает и JCL, получая полный спектр описанных проблем с ClassLoader'ами:
Цитата

If commons-logging.jar is in the system classpath in a J2EE environment, the "current" or "thread context" classloader for each individual webapp contains WEB-INF/lib, but commons-logging itself is loaded in the system (parent) classpath. commons-logging looks for log4j using the thread-context classloader and therefore will "see" log4j in WEB-INF/lib, but tries to actually load it in the system classpath, and breaks with a NoClassDefFoundError. 

Происходит это потому, что на этапе компиляции невозможно однозначно разрешить вызовы переходников от JCL к конкретным логгерам такого вида:
Код

LogFactory.getLog("logger.name.not.important.here");
 
В отличие от JCL, SLF4J вызывает статические методы своих переходников, таких как slf4j-log4j, а эти вызовы могут быть разрешены уже на этапе компиляции. Единственное, что остается прояснить, так это как удается использовать разные логгеры при связях на статике. Для этого SLF-api компилируется вместе с классом-затычкой StaticLoggerBinder, который не входит потом в slf4j-api.jar. Вместо этого во время выполнения используется аналогичный по названию, но разный по содержанию StaticLoggerBinder конкретного переходника. И раз вызовы API разрешены на этапе компиляции, то никакие загрузчики классов не участвуют в привязке API к конкретному логгеру.

Это сообщение отредактировал(а) jk1 - 2.4.2010, 07:23


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0863 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.