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

本文关键字:一行 StreamReader 日志 文件 使用 new | 更新日期: 2023-09-27 18:19:08

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

你知道怎么做最好吗?

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

你可以确保当你完成时流被处理/关闭(也就是当这个类的实例被处理时):

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日志框架

您可以将记录器类设置为可处置的,现在由调用者负责触发清理。

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();
    }
}
但是,有很多更健壮的预制日志框架,我建议您使用其中的一个,而不是自己编写。