Предотвратите использование 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.