Запретить Weblogic 12c использовать системную привязку slf4j

Мы строим новый 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? Наличие <предпочитайте-web-inf-classes> в weblogic.xml не помогает

4 ответа

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

Для файла 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>

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

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

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

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

Другие вопросы по тегам