0

現在、ログ ファイルの管理を扱うプログラムを c# で作成することを検討しています。目的は、ログ ファイルが 50 MB を超えてはならないため、ファイルの名前を変更して新しいファイルを作成し、新しいファイルへの書き込みを開始することです。ファイルの変更中にデータがログに書き込まれるのを避けるために、プログラムの一部でデータをバッファに追加し、プログラムの別の部分でバッファ内のデータを読み取り、それをファイル。ファイルに書き込めない場合は、ファイルに書き込めるまでバッファに保持します。

これを行うにはどうすればよいでしょうか。正しいものを検索しているかどうかわからないため、Google で何も見つからないようです。

あなたが提供できる助けをありがとう

4

2 に答える 2

1

BlockingCollectionを使用することをお勧めします。ログに書き込みたいスレッドは、ログ文字列をBlockingCollection. 別のスレッドが を監視しBlockingCollection、文字列をデキューしてファイルに書き込みます。ファイルが利用できない場合、スレッドは待機して再試行できます。

簡単な例については、 http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821を参照してください。

を使用できない場合はBlockingCollectionキューを使用してロックで保護できます。何かを記録する方法は次のようになります。

private Queue<string> myQueue = new Queue<string>();  // owned by the logger

void WriteLog(string s)
{
    lock (myQueue)
    {
        myQueue.Enqueue(s);
    }
}

ものを削除するスレッドは、キューからそれらを取得できます。定期的にポーリングする必要があるため、理想的とは言えませんが、それほど悪くはありません。

while (!shutdown)  // do this until somebody shuts down the program
{
    while (myQueue.Count > 0)
    {
        lock (myQueue)
        {
            string s = myQueue.Dequeue();
            // write the string s to the log file
        }
    }
    Thread.Sleep(1000); // sleep for a second and do it again.
}

忙しい待機なしでそれを行う方法はありますが、実装の詳細を覚えていません。サンプルについては、http://msdn.microsoft.com/en-us/library/system.threading.monitor.pulse.aspxを参照してください。

于 2012-04-19T21:33:37.383 に答える
1

これは、従来の生産者と消費者の問題のように思えます。これは良い出発点です。

ブロッキング コレクション

他の人が指摘しているように、車輪を再発明するよりもライブラリを使用する方が優れています。Log4net は優れたロギング ライブラリです。

于 2012-04-19T21:33:32.377 に答える