当我开始在控制台应用程序上捕获并显示日志记录异常时,我意识到由于以下错误,我的许多日志消息都不存在
该进程无法访问文件'[MY_LOG_FILE_PATH]',因为它是 被另一个进程使用
这是我将消息记录在日志文件中的方式(我会在应用程序的每次运行中创建一个新文件)。变量callingClass
和callingMethod
分别是调用Log函数的类和方法。
try
{
var stackTrace = new StackTrace();
string callingMethod = stackTrace.GetFrame(1).GetMethod().Name;
string callingClass = stackTrace.GetFrame(1).GetMethod().ReflectedType.Name;
string logText = string.Format(format, DateTime.Now, "INFO", callingClass, callingMethod, message);
if (!Directory.Exists("log"))
Directory.CreateDirectory("log");
if (!File.Exists(logFilePath))
File.Create(logFilePath);
using (FileStream f = new FileStream(logFilePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
using (StreamWriter sw = new StreamWriter(f))
sw.WriteLine(logText);
}
catch(IOException)
{
Console.WriteLine("Processes locking the file:");
var lockingProcesses = FileHelper.WhoIsLocking(logFilePath);
foreach (Process p in lockingProcesses)
Console.WriteLine("Process: " + p.ProcessName + " Machine:" + p.MachineName);
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine("The following log could not be written to file: " + message);
Console.WriteLine("Error: " + ex.Message);
Console.ResetColor();
}
当我发现IOException
导致上述情况时,我发现拥有日志文件的进程是“ dotnet” 驻留在计算机上。” / strong>,我认为这是当前计算机。
如何不丢失日志消息?
IDE :Visual Studio Community 2019版本16.0.4
.NET Framework版本:4.7.03190
操作系统:Windows 10 Pro 64x
答案 0 :(得分:1)
File.Create
创建并打开文件。因此,在下一行中,当您尝试创建新的FileStream
时,文件已打开并引发错误。
一种选择是在创建文件流时立即调用Close
:
File.Create(logFilePath).Close();
另一种方法是仅使用StreamWriter
打开/创建文件,然后完全跳过使用FileStream
。传递true
意味着附加到文件(如果存在)。
try
{
var stackTrace = new StackTrace();
string callingMethod = stackTrace.GetFrame(1).GetMethod().Name;
string callingClass = stackTrace.GetFrame(1).GetMethod().ReflectedType.Name;
string logText = string.Format(format, DateTime.Now, "INFO", callingClass, callingMethod, message);
if (!Directory.Exists("log"))
Directory.CreateDirectory("log");
using (var sw = new StreamWriter(logFilePath, true))
{
sw.WriteLine(logText);
}
}
catch(IOException)
{
Console.WriteLine("Processes locking the file:");
var lockingProcesses = FileHelper.WhoIsLocking(logFilePath);
foreach (Process p in lockingProcesses)
Console.WriteLine("Process: " + p.ProcessName + " Machine:" + p.MachineName);
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine("The following log could not be written to file: " + message);
Console.WriteLine("Error: " + ex.Message);
Console.ResetColor();
}
答案 1 :(得分:0)
尝试将您的消息推送到共享的BlockingCollection中,并具有一个从中读取并写入日志文件的线程。