85

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

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

4

7 に答える 7

38

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

于 2009-05-15T17:47:08.310 に答える
19

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

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

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

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

于 2009-05-16T06:38:04.120 に答える
15

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 パッケージ
于 2010-11-30T21:02:53.750 に答える
3

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

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

于 2009-05-15T17:48:14.423 に答える
2

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

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

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

于 2010-06-21T17:36:19.573 に答える
0

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

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

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

于 2018-08-09T10:00:36.403 に答える