写入日志文件:每次写一行时使用(... new StreamReader)?

时间:2014-08-21 13:10:41

标签: c# logging file-io streamwriter textwriter

我编写了一个带有开始和停止按钮的自动化程序,它可以反复执行各种任务,直到用户点击停止为止。在程序中,我有几个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语句的清理功能,不是吗?

知道如何做到最好吗?

提前致谢。

2 个答案:

答案 0 :(得分: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 logging framework

答案 1 :(得分: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();
    }
}

然而,有更强大的预制日志框架,我建议你使用其中一个,而不是自己编写。