2013-02-26 34 views
13

私は現在、Webcat(Tomcat 6で稼働)を開始しています slf4jを使用するコンポーネントとCommonsログを使用するコンポーネント Log4j 2.0をログ実装として使用する予定です。log4j 2.0とslf4jとCommons Loggingを併用するには

が今私の質問は以下のとおりです(SocketAppenderとSyslogAppenderもあるため、ログイベントを失うことなくリロード昇格設定の主アペンダ用):いくつかの理由 - インタフェース私は私の新しいクラスをプログラムしますか? loag4jまたはslf4j?またはコモンズロギング?

  • jarを展開するには、どのような方法が適していますか?私のアプリケーションの戦争に入れたり、私はそれらをtomcatライブラリに入れますか?

  • デプロイするにはどのようなjarsが必要ですか? log4jの、コモンズロギング(SLF4J-API-1.7.2.jar)とSLF4JのAPI(SLF4Jとコモンズバインディングを含む)(SLF4J-API-1.7.2.jar)

答えて

20

私は新しいクラスをどのインターフェイスにプログラムしますか? loag4jまたはslf4j?

SLF4Jを使用する場合は、そのインターフェイスにプログラムします。基本的なロギングの実装に最も柔軟に対応します。 slf4jのポイントはあなたがプログラムできるインターフェースなので、将来、例えばlogbackに切り替えるとコードを書き直す必要はありません。

jarを展開するにはどうすればよいですか?私のアプリケーションの戦争に入れたり、私はそれらをtomcatライブラリに入れますか?

WARに入れてください。

JARをTomcatのlibsディレクトリに置く唯一の理由(imo)は、ネイティブライブラリをロードする必要がある場合です。 Javaでは、2つの異なるクラスローダーから同じネイティブライブラリをロードすることはできないため、共通の場所に配置する必要があります。しかしそれはここでは当てはまりません。

スペースを節約する方法として、libディレクトリを考える人がいます。これは、「サーバークラス」マシンに1 GBのRAMが搭載されていても有効であったかもしれませんが、それ以上はありません。 libを避けると、デバッグが難しいクラスローディングの問題のほとんどを回避できます。

デプロイするにはどのようなjarファイルが必要ですか?

  • SLF4J-APIは、基本的なAPIである
  • SLF4J-log4j12経路Log4Jの
  • に実際のロギング
  • JCLオーバーSLF4Jインターセプト(Log4Jのに)SLF4Jを通してそれをロギングし、ルート・コモンズ
  • log4jは物理的なログフレームワークになります

私はすでにLog4Jの設定をしていると思います。そうでない場合、Log4Jを内部的に使用するコードを扱うことが気になる人は、log4j-over-slf4jがあり、Log4J呼び出しを傍受します。次に、Logbackなどのフレームワークを選択する必要があります。

(注意:私はもともとこれらのパッケージのすべてへのリンクを追加しましたが、それらを掲示するのに十分な担当者を持っていないので、here's SLF4JパッケージのすべてとMavenのリポジトリへの単一のリンクが強調表示)

+0

1. OK 2.私が戦争にすべての瓶を入れたら、私は戦争の外で伐採設定をすることができず、(自動更新で)実行時に設定を操作できないという欠点があります。 (これはもっとtomcat/log4j_2.0の質問かもしれません。私は別の投稿でそれを聞いてください) 3.私はlog4j * 2.0を使用する予定です*私はlog4j-slf4j-impl.jarがslf4j-log4j12の代わりに必要と仮定します。 .jar、これは正しいですか? – raudi

+0

log4j 2.0を使用していないので、必要な実装JARが不明です。しかし、それはSLF4Jサイトで利用できるはずです。 – parsifal

+1

あなたの設定を外部に保つために、あなたは即座にそれを変更することができます:これは、設定ファイルをlibディレクトリに置くだけです。これは、WAR内からのクラスパススキャンによって検出されます。しかし、私はJMXを使用してログレベルを調整するほうがはるかに好きです。 Log4J 1.2にはJMX Beanがあり、2.0でも期待しています。インスタンス化すると、プラットフォームJMXプロバイダに自身を登録するので、JConsoleのようなツールを使用してアクセスできます。 – parsifal

1

私が使用していないことに注意してくださいLog4J 2.0、私はLog4J 1.2でSLF4Jを使用しましたが。そう言えば、私はあなたの質問に次のように答えます:

  1. プログラムからSLF4J。これには、ロギングフレームワークから必要と思われるものすべてが含まれている素敵でシンプルなAPIがあります。 Log4J 2.0の代わりにLogbackまたはLog4J 1.2に切り替える理由を決めた場合は、バックエンドのjarsを切り替えることができます。
  2. 間違いなくアプリケーションの戦争では、ジャーを入れてください。アプリケーションサーバーのlibディレクトリにジャーを置くことはほとんどありません。そうしないと、アプリケーションサーバーだけでなく、そのアプリケーションサーバー上のすべてのWebアプリケーションに影響します。さらに、アプリケーションサーバのlibディレクトリのjarファイルは、Webアプリケーションをデプロイすることによって制御することはできませんが、手動で管理する必要があります。
  3. slf4j-api-1.7.2.jarlog4j-to-slf4j-2.0-beta4.jarlog4j-2.0-beta4.jarlog4j-core-2.0-beta4.jarのように、依存関係があります。あなたがそれを使用しているなら、Mavenが必要な依存関係をもたらすだろうと確信しています。
+0

1. OK 2内に私のweblogic.xmlでこれを持っ12cは、上記の私のコメントを参照してください。私は外部を持っているしたい場合にお勧めの変更を行います(=戦争の中にはない)ログ設定? 3.アダプター(log4j-to-slf4j.jar)ではなくブリッジ/バインディング(log4j-slf4j-impl.jar)が必要であると仮定し、@ parsifalで述べたように、jcl-over-slf4j.jarも必要です(私のコモンズロギングライブラリにもslf4jをlog4jにログオンさせるために)これは正しいのですか? – raudi

6

Iあなたのアプリケーションサーバが競合バージョンを持っている場合log4j2でSLF4Jを使用して

slf4j-api-1.7.12.jar 
log4j-api-2.2.jar 
log4j-core-2.2.jar 
log4j-slf4j-impl-2.2.jar 
jcl-over-slf4j-1.7.12.jar(get rid of commons logging jars) 

を使用していますことは、あなたには、いくつかのベンダー固有のクラスローダの設定を使用して上書きする必要があるかもしれません

例えばWebLogicに私はSRC /メイン/ webappの/ WEB-INF

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-web-app 
xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 
http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.5/weblogic-web-app.xsd"> 
<container-descriptor> 
    <prefer-application-packages> 
     <package-name>org.apache.log4j.*</package-name> 
     <package-name>org.apache.commons.logging.*</package-name> 
     <package-name>org.apache.commons.lang.*</package-name> 
     <package-name>org.apache.commons.io.*</package-name> 
     <package-name>org.apache.commons.collections4.*</package-name> 
     <package-name>org.slf4j.*</package-name> 
    </prefer-application-packages> 
</container-descriptor> 
<jsp-descriptor> 
    <keepgenerated>true</keepgenerated> 
    <debug>true</debug> 
</jsp-descriptor> 
<context-root>/cnfg</context-root> 
</weblogic-web-app> 
関連する問題