web-dev-qa-db-ja.com

Log4j2なぜlog4jで使用するのですか?

私は何かを見逃しているはずですが、私はこれを数日間見てきましたが、なぜ地球上でlog4jではなくlog4j2を使用するのですか?

私がこれまで見てきたことから、log4j2は設定が簡単であると宣伝されていますが、実際には非常に複雑です(3日前になり、ホームディレクトリにログを書き込むことができません)。自動構成は単に私には機能しません(または少なくとも私はそれを機能させることができません)、構成ファイル自体は構造がかなり複雑であり、診断に役立つものを実行時に追加するのがはるかに難しいようです.

パフォーマンス以外に、元のlog4jよりもlog4j2を使用する理由はありますか?

36
Scott Neville

Log4j 1.xからLog4j 2にアップグレードする理由

  • コミュニティサポート:Log4j 1.xは積極的に保守されていませんが、Log4j 2には質問への回答、機能の追加、バグの修正が行われている活発なコミュニティがあります。更新:2015年8月以降、 Log4j 1.xは正式にサポート終了 。Log4j 2にアップグレードすることをお勧めします。更新2: Log4j 1.2はJava 9
  • 非同期ロガー -パフォーマンス ログオフに類似
  • カスタムログレベル
  • 再構成中にログイベントを失うことなく、変更時に構成を自動的に再読み込みします。
  • Java 8スタイル ラムダサポート 遅延ログ
  • Log4j 2は garbage-free (または少なくとも低ガベージ)バージョン2.6以降です
  • フィルタリング :ログイベントのコンテキストデータ、マーカー、正規表現、およびその他のコンポーネントに基づいたフィルタリング。フィルタはロガーに関連付けることができます。これらの状況のいずれでも、共通のFilterクラスを使用できます。
  • プラグインアーキテクチャ -カスタムコンポーネントを構築することで簡単に拡張可能
  • サポートされるAPI:SLF4J、Commons Logging、Log4j-1.x、およびJava.util.logging
  • Log4j 2実装とは別のLog4j 2 API。 APIは、文字列のロギングだけでなく、CharSequences、Objects、custom Messages をサポートしています。メッセージを使用すると、興味深く複雑な構成要素がログシステムを通過して効率的に操作されるようになります。ユーザーは、独自のメッセージタイプを自由に作成し、カスタムレイアウト、フィルター、ルックアップを作成してそれらを操作できます。
  • 並行性の改善:log4j2は、Java.util.concurrentライブラリーを使用して、可能な限り低いレベルでロックを実行します。 Log4j-1.xには既知のデッドロックの問題があります。
  • XML、JSON、YAML、プロパティ構成ファイル、またはプログラムによる構成。

注意してください

  • log4j2.xmlおよびlog4j2.propertiesの形式はLog4j 1.2構成構文とは異なります
  • Log4j 2は 完全 Log4j 1.xと互換性がありません:Log4j 1.2 APIはlog4j-1.2-apiアダプターでサポートされていますが、Log4j 1.2内部に依存するカスタマイズは機能しない場合があります。
  • バージョン2.0から2.3にはJava 6が必要です。 Java 7はLog4j 2.4以降に必要です。

アップグレード時のヒント

Log4j2の使用開始時に発生する一般的な問題:

  • クラスパスにlog4j-api-2.6.2.jarとlog4j-core-2.6.2.jarの両方が必要です( 少なくとも
  • Log4j2は、log4j.xml構成ファイルではなく、log4j2。xml構成ファイルを探します
  • 構成ファイル location :クラスパスに配置するか、log4j.configurationFileシステムプロパティでそのパスを指定します
  • 構成をデバッグする にするには、構成ファイルの先頭で<Configuration status="trace">を使用します
  • Log4j2マニュアルで提供されている多くのサンプル構成の1つから始めて、少しずつベルとホイッスルを追加することをお勧めします。

問題が上記のいずれでもない場合、設定を表示し、発生している問題の詳細を提供してください。 (自動構成に何が期待されるかわかりません。これは、log4j2が構成ファイルを見つけられない場合にコンソールにERRORイベントを記録する非常に基本的な機能です。これで十分なことはめったにありません。)

ホームディレクトリに書き込むには、システムプロパティ lookup${sys:PROPERTYNAME}を使用できます。以下は、実証するための構成例です。

<Configuration status="trace">
  <Properties>
    <Property name="logfile">${sys:user.home}/log${date:yyyyMMdd}.log</Property>
  </Properties>
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%m%n"/>
    </Console>
    <File name="FILE" fileName="${sys:logfile}">
      <PatternLayout>
        <pattern>%d %p [%t] %c{1.} %m%n</pattern>
      </PatternLayout>
    </File>
  </Appenders>
  <Loggers>
    <Root level="trace">
      <AppenderRef ref="STDOUT" level="ERROR" />
      <AppenderRef ref="FILE" />
    </Root>
  </Loggers>
</Configuration>
61
Remko Popma

this を確認してください。要するに、リンクから:

Log4j 2.0の導入:

  • 新しいプラグインシステム

  • プロパティのサポート

  • jSONベースの構成とその構成の自動再読み込みのサポート。

SLF4J、Commons Logging、Apache Flume、Log4j 1.xなど、既存の多くのロギングフレームワークをサポートし、新しいプログラマーのAPIを提供します。

あなたが言ったように、それははるかに速いです。

欠点は次のとおりです。

  • log4j 2.0はlog4j 1.xとは大きく異なり、APIはほとんど互換性がありません。

  • セットアップが難しい。

新しい機能が必要ない場合は、おそらく古いLog4j 1.xで問題ありません。

7
JonasCz