详解.Net Core中的日志组件(Logging)

Logging组件是微软实现的日志记录组件包括控制台(Console)、调试(Debug)、事件日志(EventLog)和TraceSource,但是没有实现最常用用的文件记录日志功能(可以用其他第三方的如NLog、Log4Net。之前写过NLog使用的文章)。

2、默认配置

新建.Net Core Web Api项目,添加下面代码。

[Route("api/[controller]")] public class ValuesController : Controller { ILogger<ValuesController> logger;      //构造函数注入Logger public ValuesController(ILogger<ValuesController> logger) { this.logger = logger; } [HttpGet] public IEnumerable<string> Get() { logger.LogWarning("Warning"); return new string[] { "value1", "value2" }; } }

运行结果如下:

详解.Net Core中的日志组件(Logging)

我刚开始接触的时候,我就有一个疑问我根本没有配置关于Logger的任何代码,仅仅写了注入,为什么会起作用呢?最后我发现其实是在Program类中使用了微软默认的配置。

public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args)//在这里使用了默认配置 .UseStartup<Startup>() .Build(); }

下面为CreateDefaultBuilder方法的部分源码,整个源码在 https://github.com/aspnet/MetaPackages ,可以看出在使用模板创建项目的时候,默认添加了控制台和调试日志组件,并从appsettings.json中读取配置。

builder.UseKestrel((builderContext, options) => { options.Configure(builderContext.Configuration.GetSection("Kestrel")); }) .ConfigureAppConfiguration((hostingContext, config) => { var env = hostingContext.HostingEnvironment;             //加载appsettings.json文件 使用模板创建的项目,会生成一个配置文件,配置文件中包含Logging的配置项 config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);             ....... }) .ConfigureLogging((hostingContext, logging) => {              //从appsettings.json中获取Logging的配置 logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));             //添加控制台输出 logging.AddConsole();             //添加调试输出 logging.AddDebug(); })

3、建立自己的Logging配置

首先修改Program类

public class Program { public static void Main(string[] args) { //指定配置文件路径 var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory())//设置基础路径 .AddJsonFile($"appsettings.json", true, true)//加载配置文件 .AddJsonFile($"appsettings.{EnvironmentName.Development}.json", true, true) .Build(); var host = new WebHostBuilder() .UseKestrel() .UseStartup<Startup>() .UseContentRoot(Directory.GetCurrentDirectory()) .UseConfiguration(config)//使用配置 .UseUrls(config["AppSettings:Url"])//从配置中读取 程序监听的端口号 .UseEnvironment(EnvironmentName.Development)//如果加载了多个环境配置,可以设置使用哪个配置 一般有测试环境、正式环境               //.ConfigureLogging((hostingCotext, logging) => //第一种配置方法 直接在webHostBuilder建立时配置 不需要修改下面的Startup代码               //{               //    logging.AddConfiguration(hostingCotext.Configuration.GetSection("Logging"));               //    logging.AddConsole();               //}) .Build(); host.Run(); } }

修改Startup类如下面,此类的执行顺序为 Startup构造函数 > ConfigureServices > Configure

public class Startup { public IConfiguration Configuration { get; private set; } public IHostingEnvironment HostingEnvironment { get; private set; } //在构造函数中注入 IHostingEnvironment和IConfiguration,配置已经在Program中设置了,注入后就可以获取配置文件的数据 public Startup(IHostingEnvironment env, IConfiguration config) { HostingEnvironment = env; Configuration = config; } public void ConfigureServices(IServiceCollection services) {         services.AddMvc();         //第二种配置 也可以这样加上日志功能,不用下面的注入         //services.AddLogging(builder =>         //{           // builder.AddConfiguration(Configuration.GetSection("Logging"))           // .AddConsole();         //}); }      //注入ILoggerFactory public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); }        //第三种配置 注入ILogggerFactory,然后配置参数 //添加控制台输出 loggerFactory.AddConsole(Configuration.GetSection("Logging"));        //添加调试输出 loggerFactory.AddDebug(); app.UseMvc(); } }

这种结构就比较清晰明了。

4、Logging源码解析

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsxfz.html