将日志写入文本文件无法按预期工作
问题描述:
我有一个日志类,如下所示。将日志写入文本文件无法按预期工作
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”被添加到日志中。所有其他的消息都没有写入。
我该如何解决这个问题?
答
你的问题是你没有关闭日志文件,所以当你下次打开日志文件时(因为垃圾回收器尚未运行并关闭它),它会被打开。
这意味着您会收到一个异常,用于后续调用日志记录功能,您将使用空的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();
}
}
只是好奇,是有你没喜欢使用第三方像'log4net'或'nlog'什么特别的原因? – 2013-05-03 08:08:28
你的设置属性是错误的。它应该是logfilePath = value;它编译但成员没有改变 – Laurijssen 2013-05-03 08:29:54