1. 前言
ASP.NET Core 支持适用于各种内置和第三方日志记录提供应用程序的日志记录 API. 本文介绍了如何将日志记录 API 与内置提供应用程序一起使用.
2. 添加日志提供程序
日志记录提供应用程序显示或存储日志. 例如, 控制台提供应用程序在控制台上显示日志, Azure Application Insights 提供应用程序将这些日志存储在 Azure Application Insights 中. 要添加提供应用程序, 请在 Program.cs 中调用提供程序的 Add{provider name}扩展方法:
- public static void Main(string[] args)
- {
- var webHost = new WebHostBuilder()
- .UseKestrel()
- .UseContentRoot(Directory.GetCurrentDirectory())
- .ConfigureAppConfiguration((hostingContext, config) =>
- {
- var env = hostingContext.HostingEnvironment;
- config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
- .AddJsonFile($"appsettings.{env.EnvironmentName}.json",
- optional: true, reloadOnChange: true);
- config.AddEnvironmentVariables();
- })
- .ConfigureLogging((hostingContext, logging) =>
- {
- // 添加 appsettings.JSON 中关于日志的 Logging 节点配置
- logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
- // 日志控制台记录提供程序
- logging.AddConsole();
- // 日志 Debug 记录提供程序
- logging.AddDebug();
- // 日志 EventSource 记录提供程序
- logging.AddEventSourceLogger();
- })
- .UseStartup<Startup>()
- .Build();
- webHost.Run();
- }
默认项目模板调用 CreateDefaultBuilder, 该操作将添加日志记录 (控制台, DEBUG,EventSource) 提供给应用程序:
- public static void Main(string[] args)
- {
- CreateWebHostBuilder(args).Build().Run();
- }
- public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .UseStartup<Startup>();
3. 创建日志
创建日志可以从依赖注入 (DI) 中获取 ILogger<TCategoryName > 对象. 以下 Razor 页面示例会创建级别为 Information 且类别为 AboutModel 类 (Models/AboutModel) 的日志:
- public class AboutModel
- {
- private readonly ILogger _logger;
- public AboutModel(ILogger<AboutModel> logger)
- {
- //ILogger 是 Core 内置日志组件, 默认已经注入, 无需再次手动注入
- _logger = logger;
- }
- public void OnGet()
- {
- var Message = $"About page visited at {DateTime.UtcNow.ToLongTimeString()}";
- _logger.LogInformation("Message displayed: {Message}", Message);
- }
- }
- private readonly ILogger<AboutModel> _logger;
- public HomeController(ILogger<AboutModel> logger)
- {
- _logger = logger;
- }
- public IActionResult Index()
- {
- AboutModel aboutModel = new AboutModel(_logger);
- aboutModel.OnGet();
- return View();
- }
通过 Kestral 服务器启动调试:
看看控制台输出日志记录:
日志 "级别" 代表所记录事件的严重程度. 日志 "类别" 是与每个日志关联的字符串. ILogger<T > 实例会创建 "类别" 为类型 T 的完全限定名称的日志.
3.1 启动时 (Startup) 创建日志
要将日志写入 Startup 类, 构造函数签名需包含 ILogger 参数:
- public class Startup
- {
- private readonly ILogger _logger;
- public Startup(IConfiguration configuration, ILogger<Startup> logger)
- {
- Configuration = configuration;
- _logger = logger;
- }
- public IConfiguration Configuration { get; }
- public void ConfigureServices(IServiceCollection services)
- {
- _logger.LogInformation("Added TodoRepository to services");
- }
- public void Configure(IApplicationBuilder App, IHostingEnvironment env)
- {
- if (env.IsDevelopment())
- {
- _logger.LogInformation("In Development environment");
- }
- }
- }
通过 Kestral 服务器启动调试看看控制台输出日志记录:
3.2 在程序中 (Program) 创建日志
如果使用 CreateDefaultBuilder, 则可自行选择提供应用程序来替换默认应用程序. 调用 ClearProviders, 然后添加所需的应用程序.
- public class Program
- {
- public static void Main(string[] args)
- {
- var host = CreateWebHostBuilder(args).Build();
- var logger = host.Services.GetRequiredService<ILogger<Program>>();
- logger.LogInformation("Seeded the database.");
- host.Run();
- }
- public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .UseStartup<Startup>()
- .ConfigureLogging(logging =>
- {
- logging.ClearProviders();
- logging.AddConsole();
- });
- }
通过 Kestral 服务器启动调试看看控制台输出日志记录:
4.Configuration
日志记录提供程序配置由一个或多个配置提供程序提供:
●文件格式(INI,JSON 和 xml).
●命令行参数.
●环境变量.
●内存中的. NET 对象.
●未加密的机密管理器存储.
●加密的用户存储, 如 Azure Key Vault.
●(已安装或已创建的)自定义提供程序.
例如, 日志记录配置通常由应用设置文件的 Logging 部分提供. 以下示例显示了典型 appsettings.Development.JSON 文件的内容:
- {
- "Logging": {
- "LogLevel": {
- "Default": "Debug",
- "System": "Information",
- "Microsoft": "Information"
- },
- "Console":
- {
- "IncludeScopes": true
- }
- }
- }
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 https://nlog-project.org/ 是一个灵活的免费日志记录平台, 适用于各种. NET 平台, 包括. NET 标准. NLog 可以轻松写入多个目标.(数据库, 文件, 控制台)并即时更改日志记录配置.
8. 总结
这篇主要讲了 ASP.NET core 内置的日志提供程序, 内置的日志自带功能还是有限, 比如不能写入到. txt 文件或数据库中. 在项目使用中还是要考虑使用第三方日志提供程序. 本篇对于内置的日志提供程序还有: 日志消息模板, 日志作用域, Azure 中的日志记录, 日志事件 ID 等未介绍, 具体再参考官方文档.
参考文献:
ASP.NET Core 中的日志记录
来源: https://www.cnblogs.com/wzk153/p/11316482.html