参考:ASP.NET Core 中的日志记录

ILogger 和 ILoggerFactory 接口位于 Microsoft.Extensions.Logging.Abstractions 中,其默认实现位于 Microsoft.Extensions.Logging 中。

简单使用

在 StartUp 中进行配置:

  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. .ConfigureLogging(logging =>
  11. {
  12. logging.ClearProviders();
  13. logging.AddConsole();
  14. });
  15. }

在 Controller 中使用:

  1. public class TodoController : ControllerBase
  2. {
  3. private readonly TodoContext _context;
  4. private readonly ILogger _logger;
  5. public TodoController(TodoContext context,ILogger<TodoController> logger)
  6. {
  7. _context = context;
  8. _logger = logger;
  9. if (!_context.TodoItems.Any())
  10. {
  11. _context.TodoItems.Add(new TodoItem { Name = "Item1" });
  12. _context.SaveChanges();
  13. }
  14. }
  15. [HttpGet]
  16. public ActionResult<List<TodoItem>> GetAll()
  17. {
  18. _logger.LogInformation("Get All ToDo Items");
  19. return _context.TodoItems.ToList();
  20. }
  21. ...
  22. }

在输出中查看:
内置 Logger 的使用 - 图1

高级设置

配置

appsettings.json:

  1. {
  2. "Logging": {
  3. "LogLevel": {
  4. "Default": "Debug",
  5. "System": "Information",
  6. "Microsoft": "Information"
  7. },
  8. "Console": {
  9. "IncludeScopes": true
  10. }
  11. },
  12. "AllowedHosts": "*"
  13. }

在 Program 中加载配置:

  1. public static void Main(string[] args)
  2. {
  3. var webHost = WebHost.CreateDefaultBuilder(args)
  4. .UseContentRoot(Directory.GetCurrentDirectory())
  5. .ConfigureAppConfiguration((hostingContext, config) =>
  6. {
  7. config.AddJsonFile("appsettings.json", true, true);
  8. config.AddEnvironmentVariables();
  9. })
  10. .ConfigureLogging((hostingContext, logging) =>
  11. {
  12. logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
  13. logging.AddConsole();
  14. logging.AddEventSourceLogger();
  15. })
  16. .UseStartup<Startup>()
  17. .Build();
  18. webHost.Run();
  19. }

日志作用域

“作用域”可对一组逻辑操作分组。 此分组可用于将相同的数据附加到作为集合的一部分而创建的每个日志。

  1. public IActionResult GetById(string id)
  2. {
  3. TodoItem item;
  4. using (_logger.BeginScope("Message attached to logs created in the using block"))
  5. {
  6. _logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);
  7. item = _todoRepository.Find(id);
  8. if (item == null)
  9. {
  10. _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
  11. return NotFound();
  12. }
  13. }
  14. return new ObjectResult(item);
  15. }

为 Console Log 启用作用域:

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

未启用作用域时:
内置 Logger 的使用 - 图2

启用后:
内置 Logger 的使用 - 图3

第三方日志记录提供程序

适用于 ASP.NET Core 的第三方日志记录框架:

某些第三方框架可以执行语义日志记录(又称结构化日志记录)

使用第三方框架的步骤类似于使用内置提供程序:

  1. 将 NuGet 包添加到你的项目
  2. 调用 ILoggerFactory