1

我正在使用 StreamWriter 写入日志文件。

这是写日志的方法,

public void Write(string fileNamePrefix, string msg){
    GenerateFileName(fileNamePrefix);

    string logTime = "> "+DateTime.Now.ToShortDateString().ToString() + " " + DateTime.Now.ToLongTimeString().ToString()+"\r\n";

    using (StreamWriter sw = new StreamWriter(fileName, true))
    {
    sw.WriteLine(logTime + msg);
    sw.Flush();
    sw.Close();
    sw.Dispose();
    }
}

在使用该方法写入日志时,我收到一条错误消息,显示“ 进程无法访问文件 'C:\Users\mark\documents\visual studio 2010\Projects\eee\eee.WebUI\log\Order_20120613' 因为它正在被另一个进程使用。

并非总是出现错误消息,当我同时运行多个进程并且进程正在使用该方法写入日志时,我会收到该错误消息。

有人知道我做错了什么吗?如何避免这个错误?

那是写日志的正确方法吗?你通常如何写进程日志?

谢谢你。

4

2 回答 2

3

I/O 故障是I/O 相关类的预期行为。所以准备处理它们。

在您的特定情况下,它很可能是由文件名冲突引起的 - 确保“日志”文件的名称在每个进程中的进程和线程之间是唯一的。

无关评论:

  • sw.Flush();sw.Close(); sw.Dispose();如果您正在使用,则绝对不需要调用using(因为它已经正确调用,sw.Dispose()包括异常情况)。即使您不这样做,同时调用 Close 和 Dispose 也没有任何价值,因为它们都只是调用相同的代码。

  • 发明(通常称为“重新发明轮子”)日志写入和跟踪库是传统开发人员过去的时间。除非您认为它是学习练习或娱乐,否则请使用现有的库,例如已经是 .Net 框架一部分的库(它允许您配置多个跟踪侦听器等)或其他库,例如 Log4Net。

于 2012-06-13T18:38:10.103 回答
2

您应该查看log4net。线程安全(这是您在这里遇到的问题,多个线程/进程试图使用同一个文件)并且非常灵活。

于 2012-06-13T18:38:44.057 回答