きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

log4net ✖︎ 起動処理 ✖︎ まとめ

log4netの起動処理も最後となりました。

今まで断片的に起動処理の内容を見てきました。
それぞれで、参考になる実装を中心に見てきましたので、全体的な処理の流れについては疎かになっていました。
そういう事情から、今回は起動処理完了記念として、
log4netの処理の流れの観点から起動処理で何をしているのか」
をまとめてみようと思います。
環境は以下のものを使っています。
kinakomotitti.hatenablog.com



起動処理の全体像・・・ということで、今回は、Visual Studioのコードマップ機能を使って出力した「利用クラス(メソッド)と、その呼び出し順を見える化した図」を使います。
f:id:kinakomotitti:20180122211211p:plain

うわぁ、、、みにくい。。。
が、気にせず行きますw

なお、コードマップはVisual Stuidioのメニューボタンから簡単に出力することができます。
f:id:kinakomotitti:20180121232014p:plain


Loggerの起動処理が実行されてから、log4net内では、
・ILoggerRepositoryクラスのインスタンスをそれぞれのメソッドに引き渡す
・設定ファイルの情報を読み取り、ILoggerRepositoryのインスタンスに値を設定する
という処理を行っています。
処理の最後(図中の青枠の部分)には、以下の実装のようにILoggerRepositoryのGetLogger(name)メソッドを使って、それまでいろいろと設定してきたRepositoryからLogggerの情報を取得して、呼び出し元のクラスに返します。

public static ILogger GetLogger(Assembly repositoryAssembly, string name)
{
	if (repositoryAssembly == null)
	{
		throw new ArgumentNullException("repositoryAssembly");
	}
	if (name == null)
	{
		throw new ArgumentNullException("name");
	}
	//Loggerのインスタンスを呼び出し元に返却
	return RepositorySelector.GetRepository(repositoryAssembly).GetLogger(name);
}

上記の処理を経て、クラス変数としているILog型の変数に格納され、起動処理を完了させます。
全体の流れが見えたので、最後に、これまでブログで扱ってきたクラス、メソッドがそれぞれどこに位置しているのかをまとめていきます。


※番号は上の図赤枠の番号を指します。
① System.Attributeとの出会い
log4netの設定ファイルの場所をCustom Attributeを使って取得する処理についてまとめました。
呪文として使っていたコードの意味がわかったのが大きかったです。
log4net × System.Attribute × 呪文 - きな粉もち.net


② FileSystemWatcherとの出会い
こちらは、①の呪文で指定された謎プロパティ(Watch)の仕様と、その仕様を実現するために使われているFileSystemWatcherクラスについてみていきました。
そうやって設定ファイルを監視しているのね。。。って感じでしたw
kinakomotitti.hatenablog.com


③ 設定ファイルの読み込みの整理
設定ファイルの読み込み処理では、XMLの読み込み処理の整理と、ファイルの読み込み処理の実装方法についてまとめられました。
kinakomotitti.hatenablog.com
kinakomotitti.hatenablog.com
C#使いの人たちには基本的なことなのでしょう。。。
こういう基本的なことからしっかりと足元を固めて行く必要があると感じました。。。






まとめ

長らく起動処理の細かい実装を見てきました。
ここで一旦完了となります。
振り返って全体の流れを見ることで個々の処理をどのタイミングでやっていたのか、ということが整理できて良かったと思いました。
時には全体を見ることも大事ですねw

と、いうことで今後は、log4netのメインでもあるログ出力処理について、仕様の確認、洗練された実装の学習の観点で見ていきたいと思います!