きな粉もち.net

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

log4net × Lock Model × Mutex

 log4netの起動処理の追っかけは難しかったので、いったん飛ばしておきます。

とりあえず、次のステップのFileAppenderの処理について細かくみていきます・・・

 

FileAppenderクラスはこんな感じに実装されています!

f:id:kinakomotitti:20171031222941p:plain

 

ということで、上から見ていきます。

ロックモデルについて。

ロックモデルは、FileAppenderを使ってログを出力するときに、出力中のファイルに対して、どのように排他制御を行うかを決める方法のようなものです。

実行環境によって使えるモデルと使えないモデルがありますが、.NET Frameworkを利用するばあいは、3つのモデルを利用することができます。

それぞれは以下の通り。

1)InterProcessLock

ファイル名を使った名前のmutexインスタンスを使ってロックを管理。

2)MinimalLock

出力するときだけファイルをロックする。

複数プロセスから1つのログファイルに対してログを出力しようとするときなどに利用する。

(複数スレッドから1つのログファイルに出力するのは、3)のロックでも可能)

3)ExclusiveLock

初期値。ひとたびログファイルをOpenしたら、Closeされるまでロックをかけ続けるわかりやすいロック。

ロック中にサクラエディタとかを使ってファイルを開こうとすると、「他のプロセスによって・・・」の警告がでて、読み取り専用でしか開けなくなる。

 

個々の実装はそれぞれ読み解くとして、まず気になるのは、1)で使われている多重起動禁止用の実装についてです。

Mutex。初めて知りました。

System.Threading名前空間にあるクラスで、多重起動を抑制する機能を持っているようです。

多重起動を禁止するアプリを作るときは、プロセスの名前を取得して比較するしか方法がないと思っていたので、とても勉強になりました!

このMutexクラスでは、基本的に、ユーザーごとの多重起動を禁止することができるようですが、MutexNameの先頭に「Global\」をつけることですべてのユーザーに対して多重起動を禁止することができるようになります。

 

以上をふまえてlog4netを見てみると・・・

f:id:kinakomotitti:20171031230920p:plain

log4netでは、ファイル名を使ってMutexNameを作成している。

・Globalをつけていないので、ユーザーごとに多重起動を禁止する。

という仕様のようです。

~~~~~~~~~~~~~~~~~~~~~~~~~~~

長くなってきたので、分割します!