Запретить Weblogic 12c использовать системную привязку slf4j - PullRequest
14 голосов
/ 16 марта 2012

Мы строим новый systen, используя 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]

после поиска в Google мы обнаружили, что это всего лишь предупреждение, slf4j свяжет первый найденный регистратор, который в данном случае является системой weblogic.каркас логгера.Есть ли способ привязать его к каркасу логов в нашем файле WAR?имеющийв weblogic.xml не помогает

Ответы [ 4 ]

32 голосов
/ 05 октября 2012

Фильтрация должна выполняться не по классам, а по ресурсам, поскольку 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.

4 голосов
/ 30 мая 2012

Для WAR-файла вы должны использовать prefer-application-packages в weblogic.xml, как описано в этом и этом сообщениях.

В вашем случае это будет что-то вроде

<?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 голосов
/ 30 мая 2012

У нас также была эта проблема, и поскольку мы должны были настроить ведение журнала с использованием 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>

(хорошо, указанный xmlns старый, но он работает, вы можете обновить его, если хотите, я просто взял наш и удалил несвязанные части).

У нас все еще есть вышеупомянутое предупреждение, но оно использует Log4J по мере необходимости. Фактически, если вы посмотрите на URL-адрес, указанный в следующей строке в журналах (здесь опущено в вопросе), он скажет:

Предупреждение, выдаваемое SLF4J, является только предупреждением. SLF4J будет по-прежнему связываться с первым каркасом, который он найдет в пути к классам .

Так что, я думаю, он все еще использует обычный механизм загрузки классов для загрузки org.slf4j.impl.StaticLoggerBinder, который мы на самом деле сконфигурировали так, чтобы предпочесть тот, что указан в нашем EAR (то есть сделать его первым в пути к классам).

Тем не менее, предупреждение остается, но оно работает. Исправить предупреждение было бы хорошо, но, вероятно, невозможно без изменения предоставленных библиотек WebLogic.

0 голосов
/ 16 марта 2012

Я не верю, что SLF4J предоставляет способ форсировать свою собственную версию, поскольку он основан на самопознании в пути к классам.

Итак, если у вас есть права администратора в WebLogic, самое простое решение - обновить версию WebLogic SLF4J до версии 1.6.4, обновив файл в папке установки WebLogic.

В противном случае вы можете попробовать создать EAR вместо WAR и следовать рекомендациям здесь , хотя я сомневаюсь, что это сработает, если предпочитает-web-inf-classes не делает работать в WAR.

...