ASP.NET Core包含所有日志条目中的时间戳

时间:2018-03-06 10:15:08

标签: c# logging asp.net-core .net-core kestrel-http-server

我有一个启用了内置控制台日志记录的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?

感谢。

2 个答案:

答案 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] ";
         });
    })