ASP.NET Core MVC Logger

诊断中间件
• 命名空间: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
• EImah


Serilog
• Serilog.AspNetCore
• 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:
(需加载包:serillog.aspnetcore and serillog.extension.file(AspNetCore))

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseSerilog()
        .UseStartup<Startup>();
posted @ 2020-11-05 20:25  李花花小番茄  阅读(258)  评论(0)    收藏  举报