【问题标题】:How to view Serilog log file while it is used by another process?如何在另一个进程使用 Serilog 日志文件时查看它?
【发布时间】:2019-09-13 09:46:45
【问题描述】:

我正在通过 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();

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

【问题讨论】:

  • 您是否导航到文件资源管理器中的日志路径并尝试使用您选择的文本编辑器打开它们?如果您正在运行代码并尝试查看 IDE 中的日志文件,则可能是 IDE 在运行时锁定了文件。
  • 当您收到消息说它正在被另一个进程使用时,您是如何尝试打开文件的? Serilog does not lock the log file...所以你应该可以查看它的内容
  • @CaioProiete 我想通过 FTP 连接打开它。但是我的应用程序阻止了它。无法复制文件
  • @Darren 在本地机器上可以使用文本编辑器,但是当应用程序在生产环境中时,编辑器无法打开它
  • @HermesKhachatrian 你确定是应用程序阻止了它吗?可能是您无权读取 FTP 中的文件(即与您的应用或 Serilog 完全无关)

标签: c# file asp.net-core serilog locked


【解决方案1】:

这是从代码中获取日志文件内容的答案,而不是通过 FTP,但它可能对那些难以从代码中获取内容的人有用(就像我一样)。

我原来读取日志文件的解决方案是

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

return File(fileBytes, "text/plain", fileName);

使用此代码时,我仍然收到文件正被另一个进程使用的错误消息。然后我查看了 ReadAllBytesAsync 方法,在那里我找到了这一行

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 尝试相同的操作(最后一个代码 sn-p)时,错误再次出现。

所以 Serilog 为(读取?)和写入打开了日志文件,当我想打开文件进行读取时,我仍然必须允许其他进程写入它,因此我必须使用 FileShare.ReadWrite

最后我搜索了我的假设是否正确,我发现 FileShare 参数的这个很好的解释 - https://stackoverflow.com/a/25098500/6277745

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多