我有一个启用了内置控制台日志记录的ASP.NET Core 2.0应用程序。这是WebHost创建:
var webHost = WebHost.CreateDefaultBuilder(args)
.UseUrls("http://localhost:5002")
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
webHost.Run();
发送HTTP POST请求时,会生成以下日志消息并显示在Console stdout中:
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 POST http://localhost:5002/api/sample application/json 2144
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Executing action method MyApp.Controllers.SampleController.Post (Model.Solve) with arguments (MyApp.Request.MyRequest) - ModelState is Valid
info: Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor[1]
Executing ObjectResult, writing value Microsoft.AspNetCore.Mvc.ControllerContext.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
Executed action MyApp.Controllers.SampleController.Post (MyApp) in 1201.9411ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 1446.1907ms 200 application/json; charset=utf-8
作为进入生产的一项要求,我需要所有日志条目都包含一个时间戳:现在,我知道我可以在调用Log()方法时自己提供时间戳,如this open issue on the GitHub ASP.NET Logging repository中所述,但是我怎么做我应该直接在WebHost生成的日志消息上这样做(如上所示)? 有没有办法添加时间戳而不必像this StackOverflow answer中提出的解决方案那样重写完整的自定义Logger?
感谢。
答案 0 :(得分:6)
使用第三方解决方案是正确的答案。
作为同一github讨论中的explained,您链接了内置日志记录:
这实际上是一个日志记录抽象,默认接收器是非常基本的,通常可以移植到其他系统以获得更多功能。
和
有许多令人惊叹的第三方日志系统,其功能比我们提供的OOTB更丰富。我建议你在生产应用程序中使用它们。
我强烈建议您(在github问题中)考虑使用维护良好的结构化日志包,例如Serilog。
我确定您链接的自定义代码可能很好,但Serilog有很多贡献者,您可以确定它将在未来很好地发布。主页面将链接到特定于ASP.NET Core日志记录的扩展。 (我对产品没有任何既得利益,但我确实使用它,它很容易设置和使用,并且非常灵活。)
结构化日志记录允许您向日志中添加任意JSON数据,这在通过简单的“编写一串文本”日志记录进行故障排除时是一个巨大的好处。
答案 1 :(得分:3)
如链接的问题所示,此功能现在内置于Microsoft.Extensions.Logging.Console中。您可以通过设置TimestampFormat来激活它:
new ServiceCollection()
.AddLogging(opt =>
{
opt.AddConsole(c =>
{
c.TimestampFormat = "[HH:mm:ss] ";
});
})