Запретить 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.