web-dev-qa-db-ja.com

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

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 LoggersをJUL Loggerクラス。これは正しいアプローチですか?

ライブラリの組み込みJDKロギングの使用は、世界の大部分がサードパーティのライブラリを代わりに使用しているときに、このような頭痛の種になるという皮肉なことです。

83
matt b

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

36
overthink

現在のプロジェクトでは 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を使用することを心からお勧めします。

19
Jim Ferrans

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>

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

  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パッケージ
12
Emmanuel Bourg

2014年10月

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

JDK Logging Adapter

クラスLogManager

log4j 1.xからlog4j 2に移行

8
AdrianRM

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

はい、SLF4Jのダウンロードにはjul-to-slf4jが含まれていますが、まさにそうだと思います。レコードをSLF4Jに渡すJULハンドラーが含まれています。

3
araqnid

@Yishai-リンクを投稿してくれてありがとう。そこにある例は、JULをLog4Jにリダイレクトします。数年前から実稼働システムで実行していました。 JBoss 5.xはすでにJULをLog4Jにリダイレクトしているため、アップグレード時に削除しました。 SLF4Jにリダイレクトする新しいものがありますが、今はいくつかのことに使用しています。機会があればそれを投稿します。

ただし、SLF4Jには既に含まれています。

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

2
Joshua Davis

起動時に手動で追加する必要があります

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

デモ-> https://Gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d

0
jiahut