java.util.loggingをlog4jに送信する方法は?


84

log4jに対してすべてのロギングを行う既存のアプリケーションがあります。log4jを使用するか、Commons Loggingに対してログを記録する他の多くのライブラリを使用します。これにより、環境の内部でlog4jが使用されることになります。依存関係の1つは、slf4jに対してもログを記録します。これは、最終的にはlog4jにも委任されるため、正常に機能します。

ここで、キャッシュのニーズに応じて、このアプリケーションにehcacheを追加したいと思います。以前のバージョンのehcacheはcommons-loggingを使用していましたが、これはこのシナリオでは完全に機能していましたが、バージョン1.6-beta1では、commons-loggingへの依存関係が削除され、代わりにjava.util.loggingに置き換えられました。

java.util.loggingで利用できる組み込みのJDKロギングにあまり詳しくないので、JULに送信されたログメッセージをlog4jに対してログに記録する簡単な方法があるので、既存の構成を使用して、今後のロギング用にセットアップできます。 ehcacheから?

JULのjavadocsを見ると、LogManager使用する実装を変更するために一連の環境変数を設定し、おそらくそれを使用してlog4jをLoggerJULLoggerクラスでラップできるようです。これは正しいアプローチですか?

皮肉なことに、ライブラリで組み込みのJDKロギングを使用すると、世界の他の地域(ほとんど)が代わりにサードパーティのライブラリを使用している場合に、このような頭痛の種が発生します。

回答:


37

私がうまく使用したアプローチの1つは、slf4jをプライマリロギングAPIとして使用することです。次に、slf4jをlog4jにバインドします。他のフレームワーク(JULなど)を使用するサードパーティの依存関係は、slf4jにブリッジできます。


2
良いリンクですが、あなたは#jul-to-slf4j
araqnid

これは良いアプローチのように聞こえますが、機能させることができないようです:(
matt b

2
また、ehcacheのように人気のあるライブラリがjava.util.loggingのようなものに切り替わるとは信じられません-非常に骨の折れるようです
matt b

1
@matt b、JULは常にJavaランタイムに存在するため、必要な外部依存関係は最小限です。しかし、私の目には、そのコードの使用経験のない人々によって書かれたコードの真の例です。構成システムはかなり不便です。
するThorbjörnRavnアンデルセン

1
あなたが抱えている問題は、SLF4JをJULにブリッジすると、ロギングのパフォーマンスがひどいことです。具体的には、作成する各ログ行で例外がスローされ、使用するロガーコンテキストが決定されます。これにより、多くのオーバーヘッドが発生し、プロセスが遅くなります
Egwor 2013

19

現在のプロジェクトではSLF4Jを使用しており、非常にうまく機能しています。SLF4Jは、Log4Jの作成者であるCekiGülcüによって作成され、彼は本当に素晴らしい仕事をしました。我々のコードでは、直接SLF4JロギングAPIを使用して、我々は、からの呼び出しそうというSLF4Jを設定Jakarta Commonsのロギング(JCL)、(7月)を持つjava.util.logging、およびLog4JのAPIは、すべてのSLF4JのAPIにブリッジされています。あなたと同じように、さまざまなロギングAPIを選択したサードパーティ(オープンソース)ライブラリを使用しているため、これを行う必要があります。

SLF4Jの下部で、特定のロガー実装を使用するように構成します。内部または「単純な」ロガーが付属しており、Log4J、JUL、またはLogbackでこれをオーバーライドできます。構成はすべて、クラスパスにさまざまなjarファイルをドロップするだけで実行されます。

元々、CekiGülcüによって作成されたLogback実装を使用していました。これは非常に強力です。ただし、その後、ログビューアがJUL形式のメッセージを期待するGlassfish JavaEEアプリケーションサーバーにアプリケーションをデプロイすることにしました。そこで、今日、LogbackからJULに切り替え、わずか数分で2つのLogbackjarをJUL実装に接続するSLF4Jjarに置き換えました。

@overthinkのように、セットアップでSLF4Jを使用することを心からお勧めします。


8
Cekiはロギングフレームワーク/ファサードを何回再発明する必要がありますか?
融点

@mP:ロギングは魅力的ではないかもしれませんが、大規模な商用グレードのソフトウェアにとって非常に重要です。また、SLF4Jは、異なるロギングフレームワークを使用するコードを統合する問題を解決します(SunがLog4Jを採用する代わりにjava.utils.loggingを開発することを選択したことにより、より緊急になりました)。
Jim Ferrans 2010年

3
@ mP、SunがJULで行った悪い仕事のため、slf4jが必要でした。Logbackはlog4jのフォークであり、新しいプロジェクトではありません。
するThorbjörnRavnアンデルセン

3
ログバックが必要であることがわかりました。それはApacheではなく、実際に文書化されています。
スペンサーコルモス2011年

13

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はMavenCentralになく、次のリポジトリからフェッチできます。

<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>

次の手順でソースから再構築することもできます。

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. pom.xmlを編集し、log4j:log4j:1.2.15への依存関係をlog4j:apache-log4j-extras:1.2.17に置き換え、apache-log4j-componentへの依存関係を削除します
  3. mvnパッケージ

4
コードを変更せずに実行できるので、システムプロパティを追加するだけで簡単だと思います。SLF4Jはまだ同様のメカニズムを提案していませんlogging.properties。コードまたはファイルを変更してください。
Emmanuel Bourg 2013

1
残念ながら、これはlog4j2には存在しません:(
BeepDog 2013

JulLog4jBridge.assimilate();o_0
Bastian Voigt

2
警告!jul-log4j-bridgeリリースされていないapache-log4j-companionsバンドル(放棄されたものからのバックポートlog4j 1.3)を使用します。あなたはそれを構築するのに苦労するでしょう。当然、ブリッジ自体もプレリリースで放棄されています。
ivan_pozdeev 2015

@ivan_pozdeev良い点、ありがとう。それを構築するための手順を追加しました。
Emmanuel Bourg 2015

9

2014年10月

log4jのバージョン2.1には、コンポーネントlog4j-julが存在するため、これを正確に実行できます。それでも、log4j 1を使用している場合、このアプローチを使用するには、log4j2にアップグレードできる必要があります。

JDKロギングアダプタ

クラスLogManager

log4j1.xからlog4j2に移行します


2
今のところ(2018年半ば)、これは受け入れられた答えになるはずです
rmuller

将来の読者のために:私はこれが機能していることを確認します。したがって、基本的に(1)これをpom mvnrepository.com/artifact/org.apache.logging.log4j/log4j-julに追加し、(2)最初のリンクにシステムプロパティを追加します(たとえば、JVMパラメーターに-Djavaを追加します。 util.logging.manager = org.apache.logging.log4j.jul.LogManager)
Hossam El-Deen

3

私が信じているslf4jサイトには、slf4jを介して(したがってlog4jに)java.util.loggingイベントを渡すためのブリッジがあります。

はい、SLF4Jのダウンロードにはjul-to-slf4jが含まれています。これには、レコードをSLF4Jに渡すためのJULハンドラーが含まれています。


2

@ Yishai-私のウィキへのリンクを投稿していただきありがとうございます。そこでの例では、JULをLog4Jにリダイレクトしており、本番システムで数年間実行しています。JBoss 5.xはすでにJULをLog4Jにリダイレクトしているので、アップグレード時に削除しました。私はSLF4Jにリダイレクトする新しいものを持っています。これは現在いくつかのことに使用しています。機会があれば投稿します。

ただし、SLF4Jにはすでにそれがあります。

http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.