Log 4 Jの深い理解(common-loggingを使用)


まず、common-loggingが入ったjarパッケージを見てみましょう.
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class MyTest2 {

	static Log log = LogFactory.getLog(MyTest2.class);

	public void log() {
		log.debug("Debug info.");
		log.info("Info info");
		log.warn("Warn info");
		log.error("Error info");
		log.fatal("Fatal info");

	}

	/**
	 * 
	 * @param args
	 * 
	 */

	public static void main(String[] args) {
		MyTest2 test = new MyTest2();
		test.log();

	}
}

1ログ情報は5段階に分かれています
参照
all < debug < info < warn < error < fatal < off
2思想を受け継ぐ
1)つまり,1つのログが別のログの属性(出力先,ログレベル,ログフォーマットなど)を継承できる.
2)実現方式は以下の通りである.
Log 4 jは、Logの名前に基づいて継承関係を判断します.例えば、
「com.zhlmmc.lib」という名前のLogが「com.zhlmmc.lib.log」のparentであることがわかりました!Log 4 jにはJavaのObjectに相当するrootLoggerもあります.
振り返ってみると「LogFactory.getLog(MyTest 2.class)」ここの「MyTest 2.class」事実がアップロードされているのはTestというクラスのフルパス(パッケージ名+クラス名)、「MyTest 2.MyTest 2」であり、「MyTest 2」というLogが存在する場合はMyTest 2というLogが継承され、そうでない場合はrootLoggerが継承される.
3 loggerについての2点の説明
1)同じ名前のパラメータでLoggerを呼び出す.getLogger(String name)は、同じloggerの参照を返します.したがって、loggerは、互いにloggerの参照を伝達することなく、別の場所で構成されたloggerを得ることができる.
2)loggerの作成は任意の順序で行うことができ,すなわち親loggerは子loggerより後に作成することができる.log 4 jは、loggerの継承ツリーを自動的に維持します.
4一般的なプロファイル
xmlや実行時にJavaでLog 4 jを設定することは可能ですが、propertiesファイルが使いやすいでしょう.
参照
log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
分析してみます.
1行目、log 4 jを構成する.rootLogger分かったでしょう.それがルートなので、配置しなければなりません.そうしないと、他のログは何を継承しますか.他のログは構成してもよいし、構成しなくてもよい.等号の後の最初のパラメータはログレベルを表し、5つのレベルのうちの1つを記入することができます.後のパラメータはすべてLogに出力がどこにあるかを知らせます.ログを2つの場所に出力したい場合は、2つの出力パラメータを追加します.例えば、次のようにします.
log4j.rootLogger=info, stdout, file
ここでinfoは,このログのログレベルがinfoであり,infoより小さいすべてのレベルのログは記録されないことを示している.例えばこのプロファイルを使うと、私が最初に挙げたクラスの中で
  log.debug("Debug info.");
この言葉は役に立たない.debugのレベルはinfoより小さいからだ.これにより、デバッグ時に表示する情報、パブリッシュ時に削除する情報を簡単に制御できます.これらはコードを変更する必要はありません.便利でしょう.
しかし、stdoutとfileは何なのか.
次に下を見るとstdoutが配置されています.この名前は勝手に取ったもので、Aと呼ぶことができます.
  log4j.appender.A=org.apache.log4j.ConsoleAppender
では上のrootLoggerのパラメータstdoutもAに変更し、他に使うところももちろん変更します.ここのポイントは名前ではなくappenderタイプ、例えばここの「ConsoleAppender」、わかりましたね、Consoleに出力します.後ろの2行はログ形式を設定していますが、一般的には写してください.最も簡単な入門でLog 4 jの動作原理を理解することに注目している以上、fileタイプのappenderを紹介しないで、大いに探します.
実際のプロジェクト開発では、Hibernateなどのログを記録するために参照されているパッケージに遭遇する可能性が高い.では、このパッケージがログを記録する方法を簡単に制御できます.たとえば、上のプロファイルに行を追加します.
  log4j.logger.org.hibernate=fatal
ではすべてorg.hibernateパッケージの下のクラスは少ない情報しか表示されません.fatalのレベルが一番高いからです.
5デフォルトのlog 4 j初期化プロセス
Loggerクラスの静的初期化ブロック(static initialization block)ではlog 4 jの環境をデフォルトで初期化する.なお、プログラマがシステム属性を設定方法でlog 4 j環境を構成する場合、XXXConfiguratorを明示的に呼び出す必要はない.configure()メソッドでlog 4 j環境を構成しました.
ロガーの静的初期化ブロックは、初期化プロセスが完了すると、一連のlog 4 jによって定義されたシステム属性をチェックする.次のようにします.
1)システム属性log 4 jをチェックする.defaultInitOverride、この属性がfalseに設定されている場合は初期化を実行します.そうでなければ(falseでなければ、どんな値でも、値がなくても、そうでなければ)、初期化をスキップします.
2)システム属性log 4 j.configurationの値は変数resourceに割り当てられます.システム変数が定義されていない場合は、resourceを「log 4 j.properties」に割り当てます.注意:apacheのlog 4 jドキュメントでは、定義log 4 jを使用することを推奨する.configurationシステムのプロパティの方法でデフォルトの初期化ファイルを設定するのは良い方法です.
3)resource変数をURLオブジェクトurlに変換しようとする.一般的な変換方法が通じない場合はorgを呼び出す.apache.log4j.helpers.Loader.変換を完了するためのgetResource(resource,Logger.class)メソッド
4)urlが「.xml」で終わるとメソッドDOMConfiguratorが呼び出される.configure(url)は初期化を完了する.そうでない場合、メソッドが呼び出されます.configure(url)を使用して初期化を完了します.urlで指定したリソースが取得できない場合は、初期化プロセスから飛び出します.
6 Log 4 jのコード習慣
1)クラスごとにprivate staticのLoggerオブジェクトを持ち、クラス内のすべてのログ情報を出力する
2)xmlファイルを用いてlog 4 j環境の構成を完了する.プロジェクトのmain classの静的初期化ブロックにlog 4 j環境の構成コードを格納します.注意:1つのプロジェクトでは、log 4 j環境は、loggerを使用したクラスごとに呼び出されるのではなく、一度だけ構成される必要があります.
3)MyClassを使います.classパラメータとしてクラスの静的Loggerオブジェクトを作成する