0

ねえ、私は頻繁に呼び出されるロガークラスを持っています。それが繰り返し高速で呼び出されると、ファイルがすでに開いていて別のアプリケーションによって使用されているという例外がスローされることがあります。これを回避する方法を見つけた唯一の方法は、例外をキャッチしてからもう一度開こうとすることでした...これを適切に処理する方法がわかりません。

    /// <summary>
    /// Open a log file based on a date
    /// </summary>
    /// <param name="date"> Date of the file to open </param>
    public static void OpenLogFile(DateTime date)
    {
        while (true)
        {
            try
            {
                logStream = File.Open("Logs/ems." + date.ToString("yyyy-MM-dd") + ".log", FileMode.Append);
                break;
            }
            catch
            {
                continue;
            }
        }
    }




    /// <summary>
    /// Writes to a log file the specified input
    /// </summary>
    /// <param name="input"> Content to write to the log file </param>
    public static void Log(string className, string methodName, string input)
    {
            OpenLogFile(DateTime.Now);

            using (StreamWriter s = new StreamWriter(logStream))
            {
                s.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + '[' + className + '.' + methodName + "] " + input);
            }

            CloseLogFile(); 
    }




    /// <summary>
    /// Closes the current log file
    /// </summary>
    public static void CloseLogFile()
    {
        if (logStream != null)
        {
            logStream.Close();
            logStream = null;
        }
    }
4

2 に答える 2

5

これはログファイルであるため、明らかな(そして正しい)解決策は、プログラムの実行中はファイルを開いたままにしておくことだと思います。

Apacheのlog4netのように、すでに実装されているサードパーティのロガーを使用したくない場合は、ファイルに行を書き込むためにスレッドセーフなメカニズムを使用する独自の小さなロガークラスを作成できます。

それはおそらくstaticクラス、またはシングルトンでしょう。一般に、プログラムの最初と最後での実行は非常に予測可能であるため、どこで初期化してオブジェクト/クラスを閉じるかを明確にする必要があります。

于 2012-12-12T01:45:12.170 に答える
1

自由に使えるディスクではなく、少し秩序が必要です。ログ メッセージをキューに格納し、シングル スレッドのデキューおよび書き込みアイテムを使用します。

于 2012-12-12T01:47:32.933 に答える