将日志写入文本文件无法按预期工作

问题描述:

我有一个日志类,如下所示。将日志写入文本文件无法按预期工作

public class Log 
{ 
    public StreamWriter logFile 
    { get; set; } 

    public string logFilePath = Environment.GetEnvironmentVariable("Temp")+"\\testlog.txt"; 

    public string LogFilePath 
    { 
     get 
     { 
      return logFilePath; 
     } 
     set 
     { 
      value = logFilePath; 
     } 
    } 

    public void WriteLog(string logMessage) 
    { 
     try 
     { 
      if (!File.Exists(logFilePath)) 
      { 
       logFile = new StreamWriter(logFilePath); 
      } 
      else 
      { 
       logFile = File.AppendText(logFilePath); 
      } 

      logFile.WriteLine(DateTime.Now); 
      logFile.WriteLine(logMessage.ToString()); 
      logFile.WriteLine(); 
      logFile.Flush(); 
     } 
     catch 
     { 
     } 
    } 
} 

我通过使用对象作为以下给出称为Log类以上WriteLog功能。

Log lg = new Log(); 
lg.WriteLog("message1"); 
lg.WriteLog("message2"); 
lg.WriteLog("message3"); 
lg.WriteLog("message4"); 

问题是只有“message1”被添加到日志中。所有其他的消息都没有写入。

我该如何解决这个问题?

+0

只是好奇,是有你没喜欢使用第三方像'log4net'或'nlog'什么特别的原因? – 2013-05-03 08:08:28

+1

你的设置属性是错误的。它应该是logfilePath = value;它编译但成员没有改变 – Laurijssen 2013-05-03 08:29:54

你的问题是你没有关闭日志文件,所以当你下次打开日志文件时(因为垃圾回收器尚未运行并关闭它),它会被打开。

这意味着您会收到一个异常,用于后续调用日志记录功能,您将使用空的catch(这很糟糕!)隐藏。

您必须关闭或配置文件。最好的方法是把它全部放在一个使用中。这意味着你不需要刷新(因为关闭/配置FileStream会先刷新它)。

即使发生异常,A using也会确保它关闭。事实上,我认为你可以简化整个事情到这一点:

public void WriteLog(string logMessage) 
{ 
    using (var logFile = File.AppendText(logFilePath)) 
    { 
     logFile.WriteLine(DateTime.Now); 
     logFile.WriteLine(logMessage); 
     logFile.WriteLine(); 
    } 
} 

File.AppendText()将创建一个新的文件,如果一个不存在,所以你并不需要先检查。

而你的空的catch从来没有这样做。始终至少记录异常消息。如果你已经这样做了,你会发现有一个例外情况发生,你会看到它是什么 - 这可能会告诉你出了什么问题。

logFile.Close()之后添加logFile.Close()。您正在获取有关正在使用的文件的例外情况,但正在默默忽略它。你

也应该使用的

System.IO.Path.GetTempPath() 

代替

Environment.GetEnvironmentVariable("Temp") 

,因为前者更可靠。

你需要关闭冲洗

后writestream添加

  logFile.Close(); 

  logFile.WriteLine(); 
      logFile.Flush(); 
      logFile.Close(); 

有在同一个文件中的两个作家。 The StremWriter和第二个File.AppendText。后者将打开一个不可写入的新的流。所以,在代码(未经测试),移动流的初始化在构造函数:

public class Log : IDisposable 
{ 
    public const string logFilePath = Environment.GetEnvironmentVariable("Temp")+"\\testlog.txt"; 

    public Log() 
    { 
      try 
      { 
       logFile = new StreamWriter(logFilePath); 
      } 
      catch 
      { 
       logFile = File.AppendText(logFilePath); 
      } 
    } 

    public StreamWriter logFile { get; set; } 

    public string LogFilePath 
    { 
     get 
     { 
      return logFilePath; 
     } 
     set 
     { 
      value = logFilePath; 
     } 
    } 

    public void WriteLog(string logMessage) 
    { 
     logFile.WriteLine(DateTime.Now); 
     logFile.WriteLine(logMessage.ToString()); 
     logFile.WriteLine(); 
     logFile.Flush(); 
    } 

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