• (14)ASP.NET Core2.2 中的日志记录


    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是一个灵活的免费日志记录平台,适用于各种.NET平台,包括.NET标准。NLog可以轻松写入多个目标。(数据库,文件,控制台)并即时更改日志记录配置。

    8.总结

    这篇主要讲了asp.net core内置的日志提供程序,内置的日志自带功能还是有限,比如不能写入到.txt文件或数据库中。在项目使用中还是要考虑使用第三方日志提供程序。本篇对于内置的日志提供程序还有:日志消息模板、日志作用域、Azure中的日志记录、日志事件ID等未介绍,具体再参考官方文档。

    参考文献:
    ASP.NET Core 中的日志记录

  • 相关阅读:
    CF 441E Valera and Number
    CodeForces 1111E. Tree
    CodeForces 1098F. Ж-function
    CodeForces 1098E. Fedya the Potter
    CodeForces 1098D. Eels
    CodeForces 1103E. Radix sum
    CodeForces 1103D. Professional layer
    CodeForces 1103C. Johnny Solving
    CodeForces 1107F. Vasya and Endless Credits
    Hackerrank: Week of Code 36
  • 原文地址:https://www.cnblogs.com/wzk153/p/11316482.html
Copyright © 2020-2023  润新知