2

ユーザーが停止をクリックするまで、さまざまなタスクを何度も実行する、開始ボタンと停止ボタンを備えた自動化プログラムを作成しました。プログラムには、それぞれの小さなサブタスクの結果を示すいくつかの Console.WriteLines があります。これらを .txt ログに変換することにしたので、プログラムをシャットダウンした後、またはクラッシュした場合に確認できます。

次の Logger クラスを作成しました。

class Logger
{
    private string _logName;

    public Logger(string logName)
    {
        _logName = logName;

        using (StreamWriter w = File.AppendText(_logName + ".txt"))
        {
            w.WriteLine("-------------------------------");
        }
    }

    public void Log(string logMessage)
    {
        using (StreamWriter w = File.AppendText(_logName + ".txt"))
        {
            w.WriteLine(DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString() + " " + logMessage);
        }
        Console.WriteLine(logMessage);
    }
}

質問:別のクラスに、_logger という Logger インスタンスがあります。ログに行を書き込むたびに、_logger.Log を何度も呼び出します。時々、それはお互いに非常に速く進みます。ログに (using ステートメントで) 行を書き込むたびに StreamWriter の新しいインスタンスを作成するのは間違っていると感じます。そこで、StreamWriter のインスタンス化をコンストラクターに入れることを考えましたが、それでは using ステートメントのクリーンアップ機能が壊れてしまいますね。

これを行う最善の方法はありますか?

前もって感謝します。

4

2 に答える 2

3

終了時にストリームが破棄/閉じられることを確認できます(したがって、このクラスのインスタンスが破棄されるとき):

public sealed class Logger : IDisposable
{
    private string _logName;
    private StreamWriter _stream;

    public Logger(string logName)
    {
        _logName = logName;
        _stream = File.AppendText(_logName + ".txt");
    }

    public void Log(string logMessage)
    {
        _stream.WriteLine(DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString() + " " + logMessage);
    }

    public void Dispose()
    {
        _stream.Dispose();
    }
}

using-ステートメントでロガーを使用することもできます。

using (Logger log = new Logger("Path"))
{
    log.Log("Something");
    // do something else...
    log.Log("Something else");
}

または、利用可能なログ ライブラリを使用することもできます: .NET ログ フレームワーク

于 2014-08-21T13:17:34.797 に答える
1

ロガー クラスを破棄可能にすることができます。これで、クリーンアップをトリガーするのは呼び出し元の責任になります。

class Logger : IDisposeable
{
    private string _logName;
    private StreamWriter _w;

    public Logger(string logName)
    {
        _logName = logName;

        _w = File.AppendText(_logName + ".txt"))
        _w.WriteLine("-------------------------------");

    }

    public void Log(string logMessage)
    {
        _w.WriteLine(DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString() + " " + logMessage);
        Console.WriteLine(logMessage);
    }

    public void Dispose()
    {
        Dispose(true);
    }

    protected virtual void Dispose(bool disposing)
    {
        if(disposing)
            _w.Dispose();
    }
}

ただし、はるかに堅牢な既製のロギング フレームワークが存在します。独自に作成するのではなく、それらのいずれかを使用することをお勧めします。

于 2014-08-21T13:19:38.607 に答える