ロギングファサードとして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>を含めても役に立ちません
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内のロガーの代わりにロガーが使用されます。
WARファイルの場合、 this および this の投稿で説明されているように、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
ファイルを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が提供するライブラリを変更しないとおそらく不可能です。
SLF4Jはクラスパスでの自己発見に基づいているため、独自のバージョンを強制する方法を提供するとは思いません。
したがって、WebLogicの管理者権限がある場合、最も簡単な解決策は、WebLogicインストールフォルダのファイルを更新して、WebLogicのSLF4Jバージョンを1.6.4にアップグレードすることです。
それ以外の場合は、WARの代わりにEARを作成して、推奨事項に従うことができます ここprefer-web-inf-classesはWARでは機能しません。