1

StreamWriterを使用してログファイルを書き込んでいます。

そして、これは書き込みログ方式です。

public void Write(string fileNamePrefix, string msg){
    GenerateFileName(fileNamePrefix);

    string logTime = "> "+DateTime.Now.ToShortDateString().ToString() + " " + DateTime.Now.ToLongTimeString().ToString()+"\r\n";

    using (StreamWriter sw = new StreamWriter(fileName, true))
    {
    sw.WriteLine(logTime + msg);
    sw.Flush();
    sw.Close();
    sw.Dispose();
    }
}

そのメソッドを使用してログを書き込んでいるときに、「プロセスはファイル'C:\ Users \ mark \ document \ visual studio 2010 \ Projects \ eee \ eee.WebUI \ log \Order_20120613'にアクセスできません」というエラーメッセージが表示され ました。別のプロセスで使用されています。

エラーメッセージが常に発生するわけではありません。同時に多くのプロセスを実行し、プロセスがそのメソッドを使用してログを書き込んでいると、そのエラーメッセージが表示されます。

誰かが私が間違っていることを知っていますか?このエラーを回避する方法は?

そして、それはログを書くための正しい方法ですか?通常、プロセスログをどのように書き込みますか?

ありがとうございました。

4

2 に答える 2

3

I / O障害は、I/O関連クラスで予想される動作です。だからそれらを処理する準備をしなさい。

特定のケースでは、ファイル名の衝突が原因である可能性が最も高いです。「ログ」ファイルの名前がプロセスと各プロセスのスレッド間で一意であることを確認してください。

無関係なコメント:

  • sw.Flush();sw.Close(); sw.Dispose();使用している場合は、呼び出す必要はまったくありません(例外ケースを含め、usingすでに正しく呼び出されているため)。sw.Dispose()そうしない場合でも、CloseとDisposeの両方を呼び出すことは、両方が同じコードを呼び出すだけなので、価値がありません。

  • ログの書き込みとトレースのライブラリの発明(通常は「車輪の再発明」と呼ばれます)は、従来の開発者の過去の時代です。演習や娯楽の学習と見なさない限り、すでに.Netフレームワークの一部であるライブラリ(複数のトレースリスナーなどを構成できるライブラリ)やLog4Netなどの他のライブラリを使用してください。

于 2012-06-13T18:38:10.103 に答える
2

log4netを調べる必要があります。スレッドセーフ(これは、ここで発生している問題であり、複数のスレッド/プロセスが同じファイルを使用しようとしている)であり、非常に柔軟性があります。

于 2012-06-13T18:38:44.057 に答える