- PR -

log4net 使用時にログファイルがロックされ読み込みできない

1
投稿者投稿内容
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2006-02-05 09:02
log4net を利用しログ出力をしています。(C# : VS2005 Standard)

今回 log4net で出力されたログファイルを参照する処理が同アプリケーション内で必要になり、以下のコードで単純にファイルから読み込み処理を行おうとすると FileInfo.OpenRead() で System.IO.IOException "The process cannot access the file 'xxx' because it is being used by another process." が発生してしまいます。

FileInfo fi = new FileInfo(filename);
if (fi.Exists())
{
StreamReader sr = new StreamReader(fi.OpenRead(), Encoding.GetEncoding("Shift_JIS"));
text = sr.ReadToEnd();
sr.Close();
}

秀丸などのエディタで開くと「他のプロセスにより上書きが禁止されている」とは言われるものの読取専用で開くことが可能です。StreamReader は文字通り当然読み込み専用でしょうから問題なく開けないものかと思うのですが。。。

どなたか対処法をご存知ないでしょうか?

追記です。
log4net でログ出力を行うコードの前であれば問題なく読み込み出来ます。一度でもログ出力をすると上記の例外が発生します。

[ メッセージ編集済み 編集者: Shin 編集日時 2006-02-05 09:33 ]
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2006-02-05 09:59
追記です。

log4net.LogManager.ResetConfiguration()
や、
log4net.LogManager.Shutdown();

をファイル読み込みの前に実行するとロックが解除され読み込みが出来ました。しかし、その後のログ出力が全く行えなくなってしまいます。もう一度初期化するようなメソッドは見当たりません。(ResetConfiguration 自体がそういうものかと思ったのですが)
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2006-02-05 10:10
log4net のメーリングリストアーカイブを調べていたら解決しました。

FileInfo.OpenRead() の代わりに、
new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

を渡してやることで開くことが出来ました。

StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.GetEncoding("Shift_JIS"));

参考:
http://mail-archives.apache.org/mod_mbox/logging-log4net-user/200407.mbox/%3CF1BF72B3D56EE046B2844B78B0A16F0C01F579FF@vbdexchange.vbd.no%3E
1

スキルアップ/キャリアアップ(JOB@IT)