web-dev-qa-db-ja.com

Weblogic12cがシステムのslf4jバインディングを使用しないようにする

ロギングファサードとしてslf4jを使用して新しいシステムを構築しています。新しくWeblogic12cにデプロイすると、コンソールログに次のエラーが見つかりました。

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]

グーグルした後、これは単なる警告であることがわかりました。slf4jは、最初に見つかったロガー(この場合はweblogicのシステムロガーフレームワーク)をバインドします。 WARファイルのロギングフレームワークにバインドする方法はありますか? weblogic.xmlに<prefer-web-inf-classes>を含めても役に立ちません

14
dhchen

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>

また、SystemClassLoader内のロガーの代わりにロガーが使用されます。

32
Luca

WARファイルの場合、 this および this の投稿で説明されているように、prefer-application-packagesweblogic.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>
4
fglez

この問題も発生しており、Log4Jを使用してログを構成する必要があるため、これが問題でした。ただし、これまでのところ、prefer-application-packagesの使用は機能しているようです。つまり、weblogic-application.xmlファイルをEARのMETA-INFフォルダーに次のように配置します。

<?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が提供するライブラリを変更しないとおそらく不可能です。

3
Didier L

SLF4Jはクラスパスでの自己発見に基づいているため、独自のバージョンを強制する方法を提供するとは思いません。

したがって、WebLogicの管理者権限がある場合、最も簡単な解決策は、WebLogicインストールフォルダのファイルを更新して、WebLogicのSLF4Jバージョンを1.6.4にアップグレードすることです。

それ以外の場合は、WARの代わりにEARを作成して、推奨事項に従うことができます ここprefer-web-inf-classesはWARでは機能しません。

0
foch