嘿所以我有一个经常被调用的记录器类,有时当它被反复调用时会抛出一个异常,该文件已被打开,被另一个应用程序使用。我们找到解决方法的唯一方法是捕获异常然后尝试再次打开它...我不确定如何正确处理它。
/// <summary>
/// Open a log file based on a date
/// </summary>
/// <param name="date"> Date of the file to open </param>
public static void OpenLogFile(DateTime date)
{
while (true)
{
try
{
logStream = File.Open("Logs/ems." + date.ToString("yyyy-MM-dd") + ".log", FileMode.Append);
break;
}
catch
{
continue;
}
}
}
/// <summary>
/// Writes to a log file the specified input
/// </summary>
/// <param name="input"> Content to write to the log file </param>
public static void Log(string className, string methodName, string input)
{
OpenLogFile(DateTime.Now);
using (StreamWriter s = new StreamWriter(logStream))
{
s.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + '[' + className + '.' + methodName + "] " + input);
}
CloseLogFile();
}
/// <summary>
/// Closes the current log file
/// </summary>
public static void CloseLogFile()
{
if (logStream != null)
{
logStream.Close();
logStream = null;
}
}
答案 0 :(得分:6)
由于这是一个日志文件,我认为明显(正确)的解决方案是在程序执行期间保持文件处于打开状态。
如果您不想使用已经实现的第三方记录器,例如Apache的log4net,您可以编写自己的小记录器类,该类使用线程安全机制将行写入文件。
它可能是static
类或单身。通常,在程序的开头和结尾执行是非常可预测的,因此应该清楚初始化和关闭对象/类的位置。
答案 1 :(得分:1)
需要一些订单,而不是一个免费的磁盘。将日志消息存储在队列中,并使单个线程出列并写入项目。