2013-05-03 58 views
0

我有一個日誌類,如下所示。將日誌寫入文本文件無法按預期工作

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

回答

3

你的問題是你沒有關閉日誌文件,所以當你下次打開日誌文件時(因爲垃圾回收器尚未運行並關閉它),它會被打開。

這意味着您會收到一個異常,用於後續調用日誌記錄功能,您將使用空的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從來沒有這樣做。始終至少記錄異常消息。如果你已經這樣做了,你會發現有一個例外情況發生,你會看到它是什麼 - 這可能會告訴你出了什麼問題。

2

logFile.Close()之後添加logFile.Close()。您正在獲取有關正在使用的文件的例外情況,但正在默默忽略它。你

也應該使用的

System.IO.Path.GetTempPath() 

代替

Environment.GetEnvironmentVariable("Temp") 

,因爲前者更可靠。

1

你需要關閉沖洗

後writestream添加

  logFile.Close(); 

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

有在同一個文件中的兩個作家。 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(); 
    } 
}