ASP.NET Core 日志 API

ASP.NET Core 使用与 .NET Core 日志记录相同的日志记录机制。因此,强烈建议在阅读本文之前,先阅读 .NET Core 教程中的日志 API 章节。

在这里,我们将使用 ASP.NET Core 2.x MVC 应用程序。

如前一章所述,Microsoft.Extension.Logging 命名空间中的日志 API 与一个或多个内置或第三方日志提供程序一起工作。因此,在 ASP.NET Core MVC 应用程序,我们还必须安装 NuGet 软件包 Microsoft.Extension.Logging 和我们选择的一个或多个日志记录提供程序。

创建 ASP.NET Core MVC 应用程序。创建 ASP.NET Core MVC web 应用程序,它自动包含 Microsoft.Extension.LoggingNuGet 包和 Microsoft.AspNetCore.App NuGet 包下的以下日志提供程序。因此,我们不必手动安装它。

  • Microsoft.Extensions.Logging.Console
  • Microsoft.Extensions.Logging.Debug
  • Microsoft.Extensions.Logging.EventSource
  • Microsoft.Extensions.Logging.TraceSource

添加日志记录提供程序

我们需要在 LoggerFactory 中添加提供程序。在 ASP.NET Core MVC 应用程序中,对 Program.csWebHost.CreateDefaultBuilder(args) 方法的调用在内部添加了 ConsoleDebugEventSource 日志记录提供程序。

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateWebHostBuilder(args).Build().Run();
  6. }
  7. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  8. WebHost.CreateDefaultBuilder(args)
  9. .UseStartup<Startup>();
  10. }

查看 GitHubWebHost.CreateDefaultBuilder() 方法的源代码,您会发现以下代码:

  1. .ConfigureLogging((hostingContext, logging) =>
  2. {
  3. logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
  4. logging.AddConsole();
  5. logging.AddDebug();
  6. logging.AddEventSourceLogger();
  7. }).

因此,如果您想使用这些提供程序,则无需手动添加它们。如果要使用其他提供程序或任何默认提供程序,则需要删除所有现有提供程序并添加您选择的提供程序。要配置日志记录提供程序,请调用 IWebHostBuilderConfigureLogging() 扩展方法,如下所示。

  1. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  2. WebHost.CreateDefaultBuilder(args)
  3. .ConfigureLogging(logBuilder =>
  4. {
  5. logBuilder.ClearProviders();
  6. logBuilder.AddConsole();
  7. logBuilder.AddTraceSource("Information, ActivityTracing");
  8. })
  9. .UseStartup<Startup>();

在上面的实例中,ConfigureLogging() 方法执行操作以委托 action<ILogBuilder> 来配置日志记录提供程序。要添加您选择的日志记录提供程序,请使用 ClearProvider() 删除所有默认提供程序,然后调用提供程序的扩展方法来添加它,例如 AddTraceSource() 将添加跟踪侦听器提供程序,AddConsole() 方法将添加 Console 日志记录提供。

您还可以在 Startup 类的 configure() 方法中使用 ILoggerFactory 配置日志记录提供程序。让我们看一个如何在文本文件中存储日志的实例。


将日志存储在文本文件中

要将日志存储在文件中,请安装 NuGetSerilog.Extensions.Logging.fileSerillog 包含 ILoggerFactory 的扩展方法,但不包含 ILogBuilder(在 1.1.0 版中)。因此,转到 Startup.cs 文件并在 Configure() 方法中添加 ILoggerFactory 参数。然后,调用 AddFile() 扩展方法添加 Serillog 文件提供程序,如下所示。ASP.NET Core 依赖注入将自动传递此参数的 LoggerFactory 实例。

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  2. {
  3. loggerFactory.AddFile("Logs/mylog-{Date}.txt");
  4. }

这会将所有日志存储在 mylog-<date>.txt 文件中,位于应用程序的 logs 文件夹下。


在控制器中创建日志

我们可以使用 ASP.NET Core DI(依赖注入)在应用程序中的任何位置使用 ILoggerILoggerFactory。参考以下 HomeController 实例:

  1. namespace AspDotNetCoreMvcApp.Controllers
  2. {
  3. public class HomeController : Controller
  4. {
  5. private readonly ILogger _logger;
  6. public HomeController(ILogger<HomeController> logger){
  7. _logger = logger;
  8. }
  9. public IActionResult Index()
  10. {
  11. _logger.LogInformation("Log message in the Index() method");
  12. return View();
  13. }
  14. public IActionResult About()
  15. {
  16. _logger.LogInformation("Log message in the About() method");
  17. return View();
  18. }
  19. }
  20. }

在上面的实例中,ILogger<HomeController> 参数包含在构造函数中。ASP.NET Core DI 将传递 ILogger 实例,该实例可用于登录 Index()About() 操作方法。

HomeController 作为 ILogger<HomeController> 的泛型类型传递,将用作类别。例如,指定 ILogger<HomeController> 将在日志中显示完全限定的名称 AspDotNetCoreMvcApp.Controllers.HomeController,如下所示。

  1. info: AspDoteNetCoreMvcApp.Controllers.HomeController[0]
  2. Log message in the Index() method

让我们了解上面的日志消息。在这里,我们使用 LogInformation() 方法记录信息,因此它以 "info:" 开头,后跟创建日志的类的完全限定名称:AspDoteNetCoreMvcApp.Controllers.HomeControllers[0][0]是事件 id。您可以指定此事件 id 来标识记录,例如id、页码或唯一标识日志的其他重要信息。我们没有指定任何事件 id,因此它将为 0。下一行是实际的日志消息:"log message in The Index() method"。

这可以通过在构造函数中传递 ILoggerFactory 来实现。

  1. public class HomeController : Controller
  2. {
  3. private readonly ILogger _logger;
  4. public HomeController(ILoggerFactory logFactory)
  5. {
  6. _logger = logFactory.CreateLogger<HomeController>();
  7. }
  8. public IActionResult Index()
  9. {
  10. _logger.LogInformation("Log message in the Index() method");
  11. return View();
  12. }
  13. public IActionResult About()
  14. {
  15. _logger.LogInformation("Log message in the About() method");
  16. return View();
  17. }
  18. }

现在,通过导航到 /<approot文件夹>/bin/debug/netcoreapp2.1/,从命令提示符运行上述应用程序,运行 dotnet<app-name>.dll 命令,然后打开 http://localhost:5000 在浏览器中。它将在控制台上显示与上述相同的日志。

  1. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
  2. Request starting HTTP/1.1 GET http://localhost:5000/
  3. info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
  4. Route matched with {action = "Index", controller = "Home"}. Executing acti
  5. on AspDoteNetCoreMvcApp.Controllers.HomeController.Index (AspDotNetCoreMvcApp)
  6. info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
  7. Executing action method AspDoteNetCoreMvcApp.Controllers.HomeController.In
  8. dex (AspDotNetCoreMvcApp) - Validation state: Valid
  9. info: AspDoteNetCoreMvcApp.Controllers.HomeController[0]
  10. Log message in the Index() method
  11. info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
  12. Executed action method AspDoteNetCoreMvcApp.Controllers.HomeController.Ind
  13. ex (AspDotNetCoreMvcApp), returned result Microsoft.AspNetCore.Mvc.ViewResult in
  14. 0.8505ms.
  15. info: Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor[1]
  16. Executing ViewResult, running view Index.
  17. info: Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor[4]
  18. Executed ViewResult - view Index executed in 231.2839ms.
  19. info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
  20. Executed action AspDoteNetCoreMvcApp.Controllers.HomeController.Index (Asp
  21. DotNetCoreMvcApp) in 288.6931ms
  22. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  23. Request finished in 946.274ms 200 text/html; charset=utf-8
  24. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
  25. Request starting HTTP/1.1 GET http://localhost:5000/images/banner1.svg
  26. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
  27. Request starting HTTP/1.1 GET http://localhost:5000/images/banner2.svg
  28. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  29. Request finished in 5.6471ms 404
  30. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  31. Request finished in 6.5811ms 404
  32. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
  33. Request starting HTTP/1.1 GET http://localhost:5000/css/site.min.css
  34. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  35. Request finished in 0.2811ms 404
  36. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
  37. Request starting HTTP/1.1 GET http://localhost:5000/js/site.min.js
  38. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
  39. Request starting HTTP/1.1 GET http://localhost:5000/images/banner3.svg
  40. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  41. Request finished in 0.178ms 404
  42. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  43. Request finished in 0.2342ms 404
  44. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
  45. Request starting HTTP/1.1 GET http://localhost:5000/css/site.min.css
  46. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  47. Request finished in 0.1173ms 404
  48. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
  49. Request starting HTTP/1.1 GET http://localhost:5000/js/site.min.js
  50. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  51. Request finished in 0.2539ms 404
  52. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
  53. Request starting HTTP/1.1 GET http://localhost:5000/favicon.ico
  54. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  55. Request finished in 0.3253ms 404

至此,我们可以在 ASP.NET Core MVC 应用程序中使用日志。