Log4jに対してすべてのロギングを行う既存のアプリケーションがあります。また、log4jを使用するか、Commons Loggingに対してログを記録する他の多くのライブラリを使用します。これらのライブラリは、環境内でlog4jを使用します。依存関係の1つはslf4jに対してもログを記録しますが、最終的にlog4jにも委任するため、これも正常に機能します。
ここで、いくつかのキャッシングのニーズのために、このアプリケーションにehcacheを追加したいと思います。 ehcacheの以前のバージョンはcommons-loggingを使用しましたが、これはこのシナリオで完全に機能しますが、 バージョン1.6-beta1 の時点でcommons-loggingへの依存関係を削除し、Java.util.loggingに置き換えました代わりに。
Java.util.loggingで利用可能な組み込みのJDKロギングにあまり慣れていないため、log4jに対してJULにログメッセージを送信する簡単な方法があるので、既存の設定を使用して、今後のロギングをセットアップできますehcacheから?
JULのjavadocを見ると、使用するLogManager
実装を変更するための環境変数を設定でき、おそらくそれを使用してlog4j Logger
sをJUL Logger
クラス。これは正しいアプローチですか?
ライブラリの組み込みJDKロギングの使用は、世界の大部分がサードパーティのライブラリを代わりに使用しているときに、このような頭痛の種になるという皮肉なことです。
現在のプロジェクトでは SLF4J を使用しており、非常にうまく機能しています。 SLF4JはLog4Jの作成者であるCekiGülcüによって作成され、彼は本当に素晴らしい仕事をしました。このコードでは、SLF4JロギングAPIを直接使用し、 Jakarta Commons Logging (JCL)、Java.util.loggingからの呼び出しが(JUL)、および Log4J APIはすべてSLF4J APIにブリッジされます。あなたと同じように、異なるロギングAPIを選択したサードパーティ(オープンソース)ライブラリを使用しているため、それが必要です。
SLF4Jの下部で、特定のロガー実装を使用するように構成します。内部または「シンプル」ロガーが付属しており、Log4J、JUL、または Logback でこれをオーバーライドできます。構成はすべて、クラスパスに異なるjarファイルをドロップするだけで完了します。
もともとは、同じくCekiGülcüによって書かれたLogback実装を使用していました。これは非常に強力です。ただし、その後、Glassfish Java EEアプリケーションサーバーにログビューアがJUL形式のメッセージを想定しているため、アプリケーションをデプロイすることにしました。そのため、今日はLogbackからJULに切り替えました。 2つのLogback jarをJUL実装に接続するSLF4J jarに置き換えました。
@overthinkのように、セットアップでSLF4Jを使用することを心からお勧めします。
JULとlog4jをブリッジするSLF4Jよりも単純な代替手段があります。 http://people.Apache.org/~psmith/logging.Apache.org/sandbox/jul-log4j-bridge/examples.html を参照してください=
クラスパスにjul-log4j-bridgeを配置し、システムプロパティを追加するだけです。
-Djava.util.logging.manager=org.Apache.logging.julbridge.JULBridgeLogManager
jul-log4j-bridgeはMaven Centralにはなく、このリポジトリから取得できます。
<repository>
<id>psmith</id>
<url>http://people.Apache.org/~psmith/logging.Apache.org/repo</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
そして次に使用されます:
<dependency>
<groupId>org.Apache.logging</groupId>
<artifactId>Apache-jul-log4j-bridge</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>Apache-log4j-component</artifactId>
</exclusion>
</exclusions>
</dependency>
次の手順でソースから再構築することもできます。
2014年10月
Log4jのバージョン2.1にはlog4j-julというコンポーネントが存在するため、これを正確に実現できます。それでも、log4j 1を使用している場合は、このアプローチを使用するためにlog4j2にアップグレードする必要があります。
私が信じているslf4jサイトには、slf4jを介して(したがってlog4jに)Java.util.loggingイベントを渡すためのブリッジがあります。
はい、SLF4Jのダウンロードにはjul-to-slf4jが含まれていますが、まさにそうだと思います。レコードをSLF4Jに渡すJULハンドラーが含まれています。
@Yishai-リンクを投稿してくれてありがとう。そこにある例は、JULをLog4Jにリダイレクトします。数年前から実稼働システムで実行していました。 JBoss 5.xはすでにJULをLog4Jにリダイレクトしているため、アップグレード時に削除しました。 SLF4Jにリダイレクトする新しいものがありますが、今はいくつかのことに使用しています。機会があればそれを投稿します。
ただし、SLF4Jには既に含まれています。
起動時に手動で追加する必要があります
SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()
デモ-> https://Gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d