Log 4 j解惑の一つ

3356 ワード

Log 4 jというものは、みんなずっと使っていますが、本当にどれだけの人が知っていますか.どうしてそんなふうに配列しますか.あるいはどれだけパクリしないで自分で1部のlog 4 j列を配合することができますか?読者は自分にできるかどうかを聞くことができる.本章では、いくつかの重要な一環についてソースコードと組み合わせて分析します.
一、Log 4 jはその場所でプロファイルを読み取ったのですか?
この質問に答える前に、まずプログラムでログを印刷する方法を考えてみましょう.
1.ロガーを取得する.
private static Logger logger = Logger.getLogger(App.class);

2.メソッドでloggerメソッドを呼び出してログを印刷する
logger.info("this is the main Method");
そこでgetLogger()メソッドについて実装を確認したところ,このメソッドは以下のように決定された.
 static
  public
  Logger getLogger(Class clazz) {
    return LogManager.getLogger(clazz.getName());
  }
彼はLogManagerに実現を依頼した.そこで私たちは再びLogManagerにフォローして、このクラスの構造を見て、静的なstatic初期ブロックを発見して、私たちはコードを読むと、元のLog 4 jのプロファイルがここで読み取ったことを発見して、しかも彼は先にlog 4 jを探しています.xml、見つからない場合はlog 4 jを検索します.properteis.
実はもう一つのこの問題を解決する方法は、log 4 jのソースコードをプロジェクトの形式でeclipse/ideaに導入し、log 4 jをグローバルに検索することである.propertiesまたはlog 4 j.xml.なぜこの2つのファイル名を検索したいのですか?log 4 jのデフォルトプロファイル名はこの2つなので、彼はプログラムの中で、必ずこの2つのファイル名を定義する定数があり、定数がなくても、この2つのファイル名に直接基づいてプロファイルをロードする場所があります.これはプログラム開発者の正常な論理であり、処理方法である.
二、私たちはlog 4 jにいます.propertiesでは、log 4 jを構成することが多い.rootLogger?その役割は何ですか.
私たちはプロファイルでrootLogger、Appender、Layoutをマスターしました.なぜ私たちのプログラムのlogはこれらの規格に従って列を出力しますか?私たちが定義したLoggerはこのrootLoggerと何の関係がありますか?
実は命名から、私たちはrootLoggerを推測して、私たちが定義した他のLoggerのスーパークラスの列ではありませんか?実は確かにそうです!私たちは着実にgetLogger()メソッドを実行し、Hierarchyまで追跡しました.getLogger();
public
  Logger getLogger(String name, LoggerFactory factory) {
    //System.out.println("getInstance("+name+") called.");
    CategoryKey key = new CategoryKey(name);
    // Synchronize to prevent write conflicts. Read conflicts (in
    // getChainedLevel method) are possible only if variable
    // assignments are non-atomic.
    Logger logger;

    synchronized(ht) {
      Object o = ht.get(key);
      if(o == null) {
	logger = factory.makeNewLoggerInstance(name);
	logger.setHierarchy(this);
	ht.put(key, logger);
	updateParents(logger);
	return logger;
      } else if(o instanceof Logger) {
	return (Logger) o;
      } else if (o instanceof ProvisionNode) {
	//System.out.println("("+name+") ht.get(this) returned ProvisionNode");
	logger = factory.makeNewLoggerInstance(name);
	logger.setHierarchy(this);
	ht.put(key, logger);
	updateChildren((ProvisionNode) o, logger);
	updateParents(logger);
	return logger;
      }
      else {
	// It should be impossible to arrive here
	return null;  // but let's keep the compiler happy.
      }
    }
  }

実は私たちが作成したLoggerは、htという名前のHashTableに保存されています.最も重要なのはupdateParents(logger)です.この方法をさらに追跡してみると,Loogerが親Loggerを見つけられなければ,
  if(!parentFound)
      cat.parent = root;
はそのparentをrootLoggerに設定します.この方法の具体的なコードは、私は貼らないで、みんなは自分で見ることができます.ではrootLoggerのもの(Appender,Layout)は、直接継承して列を使うことができますか?
ではrootLoggerの継承体系と依存関係について、比較的簡単なumlスケッチを描きました.
(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
画像をアップロードしてN回すべて切ったので、简単に说明するしかないでしょう、あるいはみんなは中に入ってクラスの构造を见てみましょう
RootLoggerはLoggerを継承し、LoggerはCategoryに継承します.
Categoryには変数があります.このクラスはprotected Vector appenderListをカプセル化しています.Appenderを保存します.
ロガーとAppenderが1:Nの関係であることがわかる
Appenderの継承システムについては私を比較しすぎて、説明しないで、みんなは自分で見に行きます.こんなにたくさん言ったのに、みんな振り返ってプロファイルを見てみると、一気に分かったのではないでしょうか.