1.前言
ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API。本文介绍了如何将日志记录API与内置提供应用程序一起使用。
2.添加日志提供程序
日志记录提供应用程序显示或存储日志。例如,控制台提供应用程序在控制台上显示日志,Azure Application Insights提供应用程序将这些日志存储在Azure Application Insights中。要添加提供应用程序,请在Program.cs中调用提供程序的Add{provider name}扩展方法:
1public static void Main(string[] args) 2{ 3 var webHost = new WebHostBuilder() 4 .UseKestrel() 5 .UseContentRoot(Directory.GetCurrentDirectory()) 6 .ConfigureAppConfiguration((hostingContext, config) => 7 { 8 var env = hostingContext.HostingEnvironment; 9 config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 10 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", 11 optional: true, reloadOnChange: true); 12 config.AddEnvironmentVariables(); 13 }) 14 .ConfigureLogging((hostingContext, logging) => 15 { 16 //添加appsettings.json中关于日志的Logging节点配置 17 logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); 18 //日志控制台记录提供程序 19 logging.AddConsole(); 20 //日志Debug记录提供程序 21logging.AddDebug(); 22 //日志EventSource记录提供程序 23logging.AddEventSourceLogger(); 24 }) 25 .UseStartup<Startup>() 26 .Build(); 27 webHost.Run(); 28}
默认项目模板调用CreateDefaultBuilder,该操作将添加日志记录(控制台、DEBUG、EventSource)提供给应用程序:
1public static void Main(string[] args) 2{ 3 CreateWebHostBuilder(args).Build().Run(); 4} 5public static IWebHostBuilder CreateWebHostBuilder(string[] args) => 6 WebHost.CreateDefaultBuilder(args) 7 .UseStartup<Startup>();
3.创建日志
创建日志可以从依赖注入(DI)中获取ILogger<TCategoryName>对象。以下Razor页面示例会创建级别为Information且类别为AboutModel类(Models/AboutModel)的日志:
1public class AboutModel 2{ 3 private readonly ILogger _logger; 4 public AboutModel(ILogger<AboutModel> logger) 5{ 6 //ILogger是Core内置日志组件,默认已经注入,无需再次手动注入 7 _logger = logger; 8 } 9 public void OnGet() 10 { 11 var Message = $"About page visited at {DateTime.UtcNow.ToLongTimeString()}"; 12 _logger.LogInformation("Message displayed: {Message}", Message); 13 } 14} 15private readonly ILogger<AboutModel> _logger; 16public HomeController(ILogger<AboutModel> logger) 17{ 18 _logger = logger; 19} 20public IActionResult Index() 21{ 22 AboutModel aboutModel = new AboutModel(_logger); 23 aboutModel.OnGet(); 24 return View(); 25}
通过Kestral服务器启动调试:

看看控制台输出日志记录:

日志“级别”代表所记录事件的严重程度。日志“类别”是与每个日志关联的字符串。ILogger<T>实例会创建“类别”为类型T的完全限定名称的日志。
3.1启动时(Startup)创建日志
要将日志写入Startup类,构造函数签名需包含ILogger参数:
1public class Startup 2{ 3 private readonly ILogger _logger; 4 public Startup(IConfiguration configuration, ILogger<Startup> logger) 5 { 6 Configuration = configuration; 7 _logger = logger; 8 } 9 public IConfiguration Configuration { get; } 10 public void ConfigureServices(IServiceCollection services) 11 { 12 _logger.LogInformation("Added TodoRepository to services"); 13 } 14 public void Configure(IApplicationBuilder app, IHostingEnvironment env) 15 { 16 if (env.IsDevelopment()) 17 { 18 _logger.LogInformation("In Development environment"); 19 } 20 } 21}
通过Kestral服务器启动调试看看控制台输出日志记录:

3.2在程序中(Program)创建日志
如果使用CreateDefaultBuilder,则可自行选择提供应用程序来替换默认应用程序。调用 ClearProviders,然后添加所需的应用程序:
1public class Program 2{ 3 public static void Main(string[] args) 4 { 5 var host = CreateWebHostBuilder(args).Build(); 6 var logger = host.Services.GetRequiredService<ILogger<Program>>(); 7 logger.LogInformation("Seeded the database."); 8 host.Run(); 9 } 10 public static IWebHostBuilder CreateWebHostBuilder(string[] args) => 11 WebHost.CreateDefaultBuilder(args) 12 .UseStartup<Startup>() 13 .ConfigureLogging(logging => 14 { 15 logging.ClearProviders(); 16 logging.AddConsole(); 17 }); 18}
通过Kestral服务器启动调试看看控制台输出日志记录:

4.Configuration
日志记录提供程序配置由一个或多个配置提供程序提供:
●文件格式(INI、JSON 和 XML)。
●命令行参数。
●环境变量。
●内存中的.NET对象。
●未加密的机密管理器存储。
●加密的用户存储,如 Azure Key Vault。
●(已安装或已创建的)自定义提供程序。
例如,日志记录配置通常由应用设置文件的Logging部分提供。以下示例显示了典型 appsettings.Development.json 文件的内容:
1{ 2 "Logging": { 3 "LogLevel": { 4 "Default": "Debug", 5 "System": "Information", 6 "Microsoft": "Information" 7 }, 8 "Console": 9 { 10 "IncludeScopes": true 11 } 12 } 13}
Logging属性可具有LogLevel和日志提供程序属性(显示控制台)。Logging下的LogLevel属性指定了用于记录所选类别的最低级别。在本例中,System和Microsoft类别在Information级别记录,其他均在Debug级别记录。如果提供程序支持日志作用域,则IncludeScopes将指示是否启用这些域。
5.日志级别
每个日志都指定了一个LogLevel值。日志级别指示严重性或重要程度。如果LogLevel是Warning级别,那么跟踪Trace,Debug,Information级别将不会记录。ASP.NET Core 定义了以下日志级别(按严重性从低到高排列):
●跟踪Trace = 0
●调试Debug = 1
●信息 Information = 2
●警告 Warning = 3
●错误 Error = 4
●严重 Critical = 5
6.内置日志记录提供程序
**●控制台:**logging.AddConsole(); dotnet run 查看控制台日志记录输出。
**●调试:**logging.AddDebug(); 在 Linux 中,此提供程序将日志写入 /var/log/message。
**●EventSource:**logging.AddEventSourceLogger();在Windows中,它使用PerfView实用工具收集和查看日志,但尚无支持Linux或macOS的事件集合和显示工具。
**●EventLog:**logging.AddEventLog();向Windows事件日志发送日志输出。
**●TraceSource:**logging.AddTraceSource(sourceSwitchName);应用必须在.NET Framework(而非.NET Core)上运行。
7.第三方日志记录提供程序
适用于ASP.NET Core的第三方日志记录框架,链接地址官方文档中有:
●elmah.io(GitHub 存储库)
●Gelf(GitHub 存储库)
●JSNLog(GitHub 存储库)
●KissLog.net(GitHub 存储库)
●Loggr(GitHub 存储库)
●NLog(GitHub 存储库)
●Sentry(GitHub 存储库)
●Serilog(GitHub 存储库)
●Stackdriver(Github 存储库)
例如使用NLog:NLog是一个灵活的免费日志记录平台,适用于各种.NET平台,包括.NET标准。NLog可以轻松写入多个目标。(数据库,文件,控制台)并即时更改日志记录配置。
8.总结
这篇主要讲了asp.net core内置的日志提供程序,内置的日志自带功能还是有限,比如不能写入到.txt文件或数据库中。在项目使用中还是要考虑使用第三方日志提供程序。本篇对于内置的日志提供程序还有:日志消息模板、日志作用域、Azure中的日志记录、日志事件ID等未介绍,具体再参考官方文档。
参考文献:
ASP.NET Core 中的日志记录https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?view=aspnetcore-9.0&viewFallbackFrom=aspnetcore-2.2#third-party-logging-providers
《(14)ASP.NET Core2.2 中的日志记录》 是转载文章,点击查看原文。
