C# 当Serilog日志文件被另一个进程使用时,如何查看它?

C# 当Serilog日志文件被另一个进程使用时,如何查看它?,c#,file,asp.net-core,serilog,locked,C#,File,Asp.net Core,Serilog,Locked,我正在通过Serilog记录数据,无法查看当天的日志文件,因为它们被其他进程使用 I created logger in my program.cs and it is logging data very well Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(Configuration) .WriteTo.File(new JsonFormatter(), "Logs/Log.txt",

我正在通过Serilog记录数据,无法查看当天的日志文件,因为它们被其他进程使用

I created logger in my program.cs and it is logging data very well

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(Configuration)
    .WriteTo.File(new JsonFormatter(), "Logs/Log.txt", 
            shared:true, rollingInterval: RollingInterval.Day)
    .CreateLogger();

我希望能够查看当天的日志

这是从代码中获取日志文件内容的答案,而不是通过FTP,但对于那些努力从代码中获取内容的人(比如我)来说,它可能会很有用

我最初读取日志文件的解决方案是

var path = "...";
var fileBytes = await System.IO.File.ReadAllBytesAsync(path);

return File(fileBytes, "text/plain", fileName);
使用这段代码时,我仍然得到一个错误,即该文件正被另一个进程使用。然后我研究了readAllByteAsync方法,在那里我找到了这一行

new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read,...)
我发现参数FileShare很有趣。所以我看了看,还有什么其他的可能性可以放在那里,我发现了FileShare.ReadWrite,所以我尝试了它,它成功了。像这样

var path = "...";
byte[] result;
  
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
  result = new byte[stream.Length];
  await stream.ReadAsync(result, 0, (int)stream.Length);
}

return File(result, "text/plain", fileName);
当我用FileShare.Read尝试相同的(最后一个代码段)时,错误再次出现

因此Serilog已打开日志文件进行(读取?)和写入,当我要打开文件进行读取时,我还必须允许其他进程对其进行写入,因此我必须使用FileShare.ReadWrite


最后,我搜索了我的假设是否正确,并找到了关于FileShare参数的这个很好的解释-

您是否在文件资源管理器中导航到日志路径并尝试使用您选择的文本编辑器打开它们?如果您正在运行代码并试图查看IDE中的日志文件,则可能是IDE在运行时锁定了文件。当您收到消息说文件正被其他进程使用时,您如何尝试打开该文件。。。因此,您应该能够查看其contents@CaioProiete我想通过FTP连接打开它。但我的应用程序阻止了它。不可能复制文件file@Darren在本地机器中,它与文本编辑器一起工作,但当应用程序处于生产环境中时,无法通过editors@HermesKhachatrian你确定是应用程序阻止了它吗?可能是您没有读取FTP文件的权限(即与您的应用程序或Serilog完全无关)