Loggerクラスはスレッドセーフじゃなかった

Logger.GetLoggerがJava版とちがってスレッドセーフじゃないことを今日同僚が発見した。S2のLoggerクラスが保持してるHashtableはHashtable.Synchronized でOKなんですが、GetLoggerメソッドが排他制御をしていないためにほぼ同時に同じTypeを渡してコールした場合に例外を吐く可能性があります。S2Container.NETがLoggerクラスを使用する場合はこの現象が起きない書き方(Staticなメンバーで宣言)しているのでわかる範囲で問題がありません。なおかつ一度Loggerクラスが保持しているHashtableにエントリーが出来てしまえば現象は起きません。

というわけでアプリ側でS2Container.NETのLoggerを使用する場合は少々気をつける必要があります。
とりあえず対応として

  1. S2Container.NETのLoggerは使用せず log4netを直に使用する。
  2. S2Container.NETの使用方法でLoggerを使用する。(Staticなメンバーとして使用)
  3. 下駄クラスを作成して排他処理を行う。


そもそもアプリ側でLoggerクラスは使用しないのが作法でしたらごめんなさい。あと対応してもらうよう明日にでもMLに投稿しようかなと