Предотвратите использование Weblogic 12c из системной привязки slf4j
Мы создаем новую систему, используя slf4j в качестве ведомого фасада. При развертывании на новом Weblogic 12c мы обнаружили эту ошибку в журнале консоли:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/Oracle/Middleware2/modules/org.slf4j.jdk14_1.6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [zip:/opt/Oracle/Middleware2/user_projects/domains/m3/servers/AdminServer/tmp/_WL_user/test/t030q4/war/WEB-INF/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
после googling, мы обнаружили, что это всего лишь предупреждение, slf4j будет связывать первый найденный регистратор, который в этом случае является фреймворком weblogic system logger. Есть ли способ привязать его к структуре ведения журнала в нашем WAR файле? Наличие < prefer-web-inf-classes > в weblogic.xml не помогает
Ответы
Ответ 1
Фильтрация не должна выполняться на классах, а на ресурсах, потому что SLF4J ищет StaticLoggerBinder.class
как ресурс, а не как класс.
Включите это в свой weblogic-application.xml:
<wls:prefer-application-packages>
<wls:package-name>org.slf4j.*</wls:package-name>
<wls:package-name>org.apache.commons.*</wls:package-name>
</wls:prefer-application-packages>
<wls:prefer-application-resources>
<wls:resource-name>org/slf4j/impl/StaticLoggerBinder.class</wls:resource-name>
</wls:prefer-application-resources>
и ваш регистратор будет использоваться вместо того, который находится внутри System ClassLoader.
Ответ 2
Для файла WAR вы должны использовать prefer-application-packages
в weblogic.xml
, как описано в this и это.
В вашем случае это будет что-то вроде
<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
<wls:container-descriptor>
<wls:prefer-application-packages>
<wls:package-name>org.slf4j</wls:package-name>
</wls:prefer-application-packages>
</wls:container-descriptor>
</wls:weblogic-web-app>
Ответ 3
У нас также была эта проблема, и поскольку нам необходимо настроить ведение журнала с помощью Log4J, это было проблемой. Тем не менее, использование prefer-application-packages
, похоже, работает до сих пор, т.е. Помещая файл weblogic-application.xml
в папку META-INF
EAR со следующим:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-application.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd" >
<prefer-application-packages>
<package-name>org.slf4j</package-name>
</prefer-application-packages>
</weblogic-application>
(ok указанный xmlns является старым, но он работает, вы можете обновить его, если хотите, я просто взял наш и удалил несвязанные части).
У нас все еще есть вышеупомянутое предупреждение, но он использует Log4J по мере необходимости. Фактически, если вы посмотрите URL, указанный в следующей строке в журналах (опущен здесь в вопросе), в нем говорится:
Предупреждение, выданное SLF4J, - это только предупреждение. SLF4J по-прежнему связывается с первой структурой, которую он находит на пути к классу.
Поэтому я предполагаю, что он по-прежнему использует обычный механизм загрузки классов для загрузки org.slf4j.impl.StaticLoggerBinder
, который мы на самом деле настроили на то, чтобы предпочесть его в нашем EAR (т.е. сделать его первым в пути к классам).
Тем не менее, предупреждение остается, но оно работает. Исправление предупреждения было бы хорошим, но, возможно, не возможным без изменения библиотек, предоставленных WebLogic.
Ответ 4
Я не верю, что SLF4J предоставляет способ заставить свою собственную версию, поскольку она основана на самообнаружении в пути к классам.
Итак, если у вас есть права администрирования в WebLogic, самым простым решением является обновление версии Web-версии SLF4J до версии 1.6.4 путем обновления файла в папке установки WebLogic.
В противном случае вы можете попытаться создать EAR вместо WAR и следовать рекомендациям здесь, хотя я сомневаюсь, что это сработает, web-inf-классы не работают в WAR.