我编写了一个带有开始和停止按钮的自动化程序,它可以反复执行各种任务,直到用户点击停止为止。在程序中,我有几个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语句的清理功能,不是吗?
知道如何做到最好吗?
提前致谢。
答案 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();
}
}
然而,有更强大的预制日志框架,我建议你使用其中一个,而不是自己编写。