24 Logging.mp4 (81.8MB)

诊断中间件

  • 命名空间:Microsoft.AspNetCore.Diagnostics
  • 作用:报告信息并处理异常

常用的诊断中间件:

  • UseDeveloperExceptionPage
  • UseStatusCodePages:返回 400~600 的状态码
  • UseExceptionHandler
  • UseWelcomePage:欢迎页,网站还在开发时可以启用该中间件
  • UseDatabaseErrorPage

UseStatusCodePages 效果:
image.png

ASP.NET Core 里的 Log 系统

  • EventSource
  • ILogger
  • DiagnosticSource

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

ILogger

ILogger 基于 Providers

  • 内置
  • 可扩展使用其他的,或自己构建

内置的 Log Providers:

  • Console
  • Debug:VS Debug 窗口
  • EventSource:可以做 Event Tracing
  • EventLog:将 Log 写入 Windows 事件 Log
  • TraceSource:仅支持完整的 .NET Framework
  • Azure App Service

Log 等级:

  • Trace
  • Debug
  • Information
  • Warning
  • Error
  • Critical

记录 Log 时的选项:

  • 分类
  • Event ID
  • 格式化字符串

    Logger 的使用

    查看 WebHost 源码,可以看到已经添加了好几个 Providers:
    1. .ConfigureLogging((Action<WebHostBuilderContext, ILoggingBuilder>) ((hostingContext, logging) =>
    2. {
    3. logging.AddConfiguration((IConfiguration) hostingContext.Configuration.GetSection("Logging"));
    4. logging.AddConsole();
    5. logging.AddDebug();
    6. logging.AddEventSourceLogger();
    7. }))

自定义 Logger:

  1. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  2. WebHost.CreateDefaultBuilder(args)
  3. .ConfigureLogging((hostingContext, logging) =>
  4. {
  5. logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
  6. logging.AddConsole();
  7. })
  8. .UseStartup<Startup>();

MyLogEventIds:

  1. public class MyLogEventIds
  2. {
  3. public const int HomePage = 1000;
  4. public const int AlbumPage = 1100;
  5. }

Logger 的注入和使用:

  1. public class HomeController : Controller
  2. {
  3. private readonly ILogger<HomeController> _logger;
  4. public HomeController(ILogger<HomeController> logger)
  5. {
  6. _logger = logger;
  7. }
  8. public IActionResult Index()
  9. {
  10. _logger.LogInformation(MyLogEventIds.HomePage, "Visiting Home Index ...");
  11. return View();
  12. }
  13. ...
  14. }

效果:
image.png

推荐写法:

  1. // 推荐,会记录单独的 id 参数
  2. _logger.LogInformation(MyLogEventIds.AlbumPage, "Visiting Album {0}", id);
  3. // 不推荐,仅记录了字符串
  4. _logger.LogInformation(MyLogEventIds.AlbumPage, $"Visiting Album {id}");

第三方 Log Provider

配置 Serilog:

  1. public static void Main(string[] args)
  2. {
  3. Log.Logger = new LoggerConfiguration()
  4. .MinimumLevel.Debug()
  5. .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
  6. .Enrich.FromLogContext()
  7. .WriteTo.Console()
  8. .WriteTo.File(Path.Combine("logs", "log.txt"), rollingInterval: RollingInterval.Day)
  9. .CreateLogger();
  10. var host = CreateWebHostBuilder(args).Build();
  11. ...
  12. }

使用 Serilog:

  1. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  2. WebHost.CreateDefaultBuilder(args)
  3. .UseSerilog()
  4. .UseStartup<Startup>();

NLog

NLog.Web.AspNetCore