.net-core - 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
解决方案
您正在使用的 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
推荐阅读
- arrays - 如何拆分具有逗号并更新为单独元素的字符串数组?
- c# - Visual Studio 2017:与 IBM.Data.DB2 的连接失败
- angular - 'e-columns' 不是已知元素:
- sql-server - 来自 XML 的数据 | SQL 服务器
- visual-studio - Azure Pipeline 未找到实际可用的包
- reactjs - antd 切换检查属性
- python - 需要帮助制作不和谐的音乐机器人
- jquery - 按钮单击事件未触发 JQuery 代码
- java - Scala / Java word2vec 阅读器
- arrays - 如何回溯到点数组,对要求用户输入的每个字符进行评分,C