2
public static class LogWriter
{
    private static ReaderWriterLockSlim writeLock = new ReaderWriterLockSlim();
    public static void WriteExceptionLog(string content)
    {
        #if DEBUG
        MessageBox.Show(content);
        #endif
        WriteLog(content, Constant.EXCEPTION_LOG_PATH);
    }
    public static void WriteLog(string content, string path)
    {
        try
        {
            writeLock.EnterWriteLock();
            string directory = Path.GetDirectoryName(path);
            if (!Directory.Exists(Path.GetDirectoryName(directory)))
                Directory.CreateDirectory(directory);
            using (StreamWriter writeFile = new StreamWriter(path, true))
            {
                content = DateTime.Now + " : " + content;
                writeFile.WriteLine(content);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            writeLock.ExitWriteLock();
        }
    }
}

ログを書き込むクラスがあります。私はログに非同期で書き込みを行っているため、書き込みが完了したらロックして解放する必要がありますが、これはやや面倒な解決策のようで、パフォーマンスが悪い可能性さえあります。

これを処理するより良い方法は何ですか?

4

2 に答える 2

3

パフォーマンス上の理由から、またログ オンとログ オフの間で大きく異なる動作を回避するために、スレッドごとに 1 つのバッファリングされたログ ファイルを実行することをお勧めします。

  • ロックを避けるためにスレッドごとに 1 つ: 競合なし
  • ディスク遅延を回避するためにバッファリング

対応するものは次のとおりです。

  • 時間 (ミリ秒) に基づいたマージ ツールは、アプリケーション アクティビティ全体 (対スレッド アクティビティ) を確認するために必要です。
  • 残忍な終了の場合、バッファリングは最後のログレコードを隠す可能性があります

リアルタイムにさらに一歩進むには、メモリにログインし、要求に応じてログを抽出するための専用インターフェイスを開発する必要がありますが、この種のログは通常、ハード リアルタイム組み込みアプリケーション用に予約されています。

CPU 消費量を抑えた安全なロギングのその他のソリューション (低レベルの C プログラミング):

  • ログ レコード バッファを共有メモリに配置する
  • 観察されたプロセスは、ログ レコード プロデューサーとして機能します
  • ログ レコード コンシューマとして機能する、優先度の高いログ マネージャ プロセスを作成します。
  • フリップ/フロップ メカニズムの背後でコンシューマーとプロデューサー間の通信を管理します。つまり、クリティカル セクションでのポインターの割り当てです。

監視されたプロセスがクラッシュした場合、共有メモリ セグメントがログ マネージャー プロセスに接続されているため、ログ レコードは失われません。

于 2012-10-23T06:21:03.210 に答える
0

各ログ要求でファイルを開いたり、書き込んだり、閉じたりすることは、冗長で非効率的です。

ログクラスで、バッファーを使用し、そのバッファーの内容を、X要求ごと、シャットダウンごと、またはY分ごとにファイルに書き込みます。

于 2012-10-23T06:28:08.237 に答える