诊断中间件
- 命名空间:Microsoft.AspNetCore.Diagnostics
- 作用:报告信息并处理异常
常用的诊断中间件:
- UseDeveloperExceptionPage
- UseStatusCodePages:返回 400~600 的状态码
- UseExceptionHandler
- UseWelcomePage:欢迎页,网站还在开发时可以启用该中间件
- UseDatabaseErrorPage
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:.ConfigureLogging((Action<WebHostBuilderContext, ILoggingBuilder>) ((hostingContext, logging) =>
{
logging.AddConfiguration((IConfiguration) hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
}))
自定义 Logger:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
})
.UseStartup<Startup>();
MyLogEventIds:
public class MyLogEventIds
{
public const int HomePage = 1000;
public const int AlbumPage = 1100;
}
Logger 的注入和使用:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
_logger.LogInformation(MyLogEventIds.HomePage, "Visiting Home Index ...");
return View();
}
...
}
效果:
推荐写法:
// 推荐,会记录单独的 id 参数
_logger.LogInformation(MyLogEventIds.AlbumPage, "Visiting Album {0}", id);
// 不推荐,仅记录了字符串
_logger.LogInformation(MyLogEventIds.AlbumPage, $"Visiting Album {id}");
第三方 Log Provider
- Serilog
- NLog
-
Serilog
- Serilog.Sinks.Console:输出到控制台
- Serilog.Sinks.File:以纯文本或 JSON 格式输出到 txt
配置 Serilog:
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File(Path.Combine("logs", "log.txt"), rollingInterval: RollingInterval.Day)
.CreateLogger();
var host = CreateWebHostBuilder(args).Build();
...
}
使用 Serilog:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog()
.UseStartup<Startup>();