首页 > 解决方案 > Serilog 不会在 .NET 5 控制台应用程序中使用 LoggerFactory 写入文件,不会产生错误或输出

问题描述

我正在尝试通过 LoggerFactory 使用 Serilog AddFile但我无法让它做任何事情

这是我appsettings.json的,与入门指南相同。

这是我所拥有的:

IConfiguration Configuration = new ConfigurationBuilder()
    //.SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "Logs"))
    .AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "Properties", "appsettings.json"), optional: false, reloadOnChange: false)
    //.AddEnvironmentVariables()
    //.AddCommandLine(args)
    .Build();

ILoggerFactory loggerFactory = LoggerFactory.Create(builder => {
    builder
        .AddConfiguration(Configuration.GetSection("Logging"))
        .AddConsole()
        .AddDebug()
        .AddFile("log.txt"); //Configuration.GetSection("Logging"));
});

ILogger<Program> logger = loggerFactory.CreateLogger<Program>();

logger.LogTrace("Trace");
logger.LogInformation("Information");
logger.LogDebug("Debug");
logger.LogError("Error");
logger.LogCritical("Critical");

我在控制台中看到了输出。我没有收到任何错误。即使建议添加:

Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));

来自:https ://github.com/serilog/serilog/wiki/Debugging-and-Diagnostics

标签: .net-coreserilog

解决方案


您正在使用的 Serilog 扩展 ( Serilog.Extensions.Logging.File ) 在内部以单独的线程异步写入文件,并且您的应用程序在 Serilog 有机会将日志刷新到磁盘上的文件之前终止(这可能需要约 2 秒)。

通常,您会使用一个应用程序主机来处理在应用程序终止之前处理记录器(和其他服务),从而强制刷新将写入磁盘,但在您使用简单控制台应用程序的情况下,没有人会处理日志所以在应用程序终止之前不会发生最终刷新。

Serilog 有一个Log.CloseAndFlush通常在这种情况下使用的方法,您应该在您的应用程序终止之前调用它,但是Log.CloseAndFlush不适用于Serilog.Extensions.Logging.File(至少在撰写本文时是最新版本)因为它没有将它创建的记录器分配给Log.Logger试图CloseAndFlush处理的记录器。

因此,在您的情况下,在没有主机且无法使用的情况下CloseAndFlush,您需要防止应用程序终止几秒钟,例如,通过使用 a 阻塞主线程Thread.Sleep或使用 a 等待用户输入Console.ReadLine,或者相似的...

// ...
logger.LogError("Error");
logger.LogCritical("Critical");

// Just for the sake of proving that the file is being written (not production code)
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5)); // <<<<<

相关问题:故障排除/调试日志记录的方法?#48


推荐阅读