我有一个日志类,如下所示。
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
{
}
}
}
我使用下面给出的对象调用了WriteLog
类中的上述Log
函数。
Log lg = new Log();
lg.WriteLog("message1");
lg.WriteLog("message2");
lg.WriteLog("message3");
lg.WriteLog("message4");
问题是只有“message1”被添加到日志中。所有其他消息都没有写入。
我该如何解决这个问题?
答案 0 :(得分:3)
你的问题是你没有关闭日志文件,所以当你下次打开它时它仍然打开(因为垃圾收集器还没有运行并为你关闭它)。
这意味着你后来对日志记录功能的调用会得到一个异常,你隐藏了一个空的catch
(这很糟糕!)。
您必须关闭或处置该文件。最好的方法是将它全部包含在使用中。这意味着你也不需要刷新(因为关闭/处理FileStream会先刷新它)。
using
将确保即使发生异常也会关闭。事实上,我认为你可以简化整个事情:
public void WriteLog(string logMessage)
{
using (var logFile = File.AppendText(logFilePath))
{
logFile.WriteLine(DateTime.Now);
logFile.WriteLine(logMessage);
logFile.WriteLine();
}
}
File.AppendText()
将创建一个新文件(如果尚未存在),因此您无需先检查。
关于你所拥有的空catch
。 从不那样做。始终至少记录异常消息。如果你这样做了,你会发现异常正在发生,你会看到它是什么 - 这可能会告诉你出了什么问题。
答案 1 :(得分:2)
在logFile.Close()
之后添加logFile.Close()
。您正在获取有关正在使用的文件的例外情况,但却默默地忽略它。
另外你应该使用
System.IO.Path.GetTempPath()
而不是
Environment.GetEnvironmentVariable("Temp")
因为前者更可靠。
答案 2 :(得分:1)
刷新后需要关闭写入流
添加
logFile.Close();
喜欢
logFile.WriteLine();
logFile.Flush();
logFile.Close();
答案 3 :(得分: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();
}
}