我正在开发一个基于ASP.NET Core 3.1的应用程序。我希望能够将事件记录到文件中,并且能够在应用程序运行时读取它们。为此,我尝试使用Serilog.Extensions.Logging.File NuGet包,并将日志文件路径指定如下:
任何试图以这种方式读取或写入文件的尝试
编辑:我已安装Serilog.AspNetCore,并进行了如下更改,同时从 Configure 函数中删除了 logFactory。但是异常仍然发生。
然后使用下面的示例查询来读取2020年3月13日星期五记录的日志。
Startup.cs
public void Configure(IApplicationBuilder app, ILoggerFactory logFactory)
{
logFactory.AddFile("Log");
}
任何试图以这种方式读取或写入文件的尝试
string ReadLog(string logPath)
{
return System.IO.File.ReadAllText(logPath);
}
以 System.IO.IOException:“由于正在被另一个进程使用,因此无法访问文件 {log-path}。”
异常结束。
编辑:我已安装Serilog.AspNetCore,并进行了如下更改,同时从 Configure 函数中删除了 logFactory。但是异常仍然发生。
Program.cs
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File(
"Logs/log-.txt",
shared: true,
flushToDiskInterval: TimeSpan.FromSeconds(5),
rollingInterval: RollingInterval.Day)
.CreateLogger();
try
{
Log.Information("Starting web host");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).UseSerilog();
编辑2:根据julealgon的请求,我分享我的精确读取逻辑。我正在尝试使用一个控制器进行读取,我按照以下方式声明了它:
[Controller]
[Route("[controller]")]
public class LogController : Controller
{
[Route("Read")]
public IActionResult ReadLog(string logPath)
{
if (System.IO.File.Exists(logPath))
{
string logContent = System.IO.File.ReadAllText(logPath);//exception appears here.
return Content(logContent);
}
else return NotFound();
}
}
然后使用下面的示例查询来读取2020年3月13日星期五记录的日志。
https://localhost:44323/Log/Read?logPath=Logs\log-20200313.txt
Program.cs
中使用来自这里的AddSerilog
扩展进行配置。 - julealgonshared
参数。 - Fei Han"Logs/log-.txt"
真的是你要读取的路径吗? - julealgon