Log 4 j解惑の一つ
3356 ワード
Log 4 jというものは、みんなずっと使っていますが、本当にどれだけの人が知っていますか.どうしてそんなふうに配列しますか.あるいはどれだけパクリしないで自分で1部のlog 4 j列を配合することができますか?読者は自分にできるかどうかを聞くことができる.本章では、いくつかの重要な一環についてソースコードと組み合わせて分析します.
一、Log 4 jはその場所でプロファイルを読み取ったのですか?
この質問に答える前に、まずプログラムでログを印刷する方法を考えてみましょう.
1.ロガーを取得する.
2.メソッドでloggerメソッドを呼び出してログを印刷する
logger.info("this is the main Method");
そこでgetLogger()メソッドについて実装を確認したところ,このメソッドは以下のように決定された.
実はもう一つのこの問題を解決する方法は、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();
実は私たちが作成したLoggerは、htという名前のHashTableに保存されています.最も重要なのはupdateParents(logger)です.この方法をさらに追跡してみると,Loogerが親Loggerを見つけられなければ,
ではrootLoggerの継承体系と依存関係について、比較的簡単なumlスケッチを描きました.
(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
画像をアップロードしてN回すべて切ったので、简単に说明するしかないでしょう、あるいはみんなは中に入ってクラスの构造を见てみましょう
RootLoggerはLoggerを継承し、LoggerはCategoryに継承します.
Categoryには変数があります.このクラスはprotected Vector appenderListをカプセル化しています.Appenderを保存します.
ロガーとAppenderが1:Nの関係であることがわかる
Appenderの継承システムについては私を比較しすぎて、説明しないで、みんなは自分で見に行きます.こんなにたくさん言ったのに、みんな振り返ってプロファイルを見てみると、一気に分かったのではないでしょうか.
一、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の継承システムについては私を比較しすぎて、説明しないで、みんなは自分で見に行きます.こんなにたくさん言ったのに、みんな振り返ってプロファイルを見てみると、一気に分かったのではないでしょうか.