.NET Core开发实战课程备忘(12) -- 结构化日志组件Serilog:记录对查询分析友好的日志
结构化日志的好处
主要场景
实现日志告警
实现上下文的关联
实现与追踪系统集成
代码实现 创建项目 创建名字为LoggingSerilogDemo
的ASP.NET Core
项目,类型为API
,因为使用的日志结构化组件为Serilog
,所以需要引入以下的包:
用Serilog替换自带的日志框架 修改Program
类,让Serilog替换掉ASP.NET Core
自带的日志框架,具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 using System;using System.IO;using Microsoft.AspNetCore.Hosting;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.Hosting;using Serilog;using Serilog.Formatting.Compact;namespace LoggingSerilogDemo { public class Program { public static IConfiguration Configuration { get ; } = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json" , optional: true , reloadOnChange: true ) .AddJsonFile($"appsettings{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT" ) ?? "Production" } .json" , optional: true , reloadOnChange: true ) .AddEnvironmentVariables() .Build(); public static int Main (string [] args ) { Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(Configuration) .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Console(new RenderedCompactJsonFormatter()) .WriteTo.File(formatter: new CompactJsonFormatter(), "logs\\log.txt" , rollingInterval: RollingInterval.Day) .CreateLogger(); try { Log.Information("Starting web host" ); CreateHostBuilder(args).Build().Run(); return 0 ; } catch (Exception ex) { Log.Fatal(ex,"Host terminated unexpectedly" ); return 1 ; } finally { Log.CloseAndFlush(); } } public static IHostBuilder CreateHostBuilder (string [] args ) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .UseSerilog(dispose: true ); } }
代码解析:
新建Configuration
静态属性,直接读取appsettings.json
的配置
new LoggerConfiguration
是创建一个Serilog
的logger
对象,调的各种方法是进行日志配置
CreateHostBuilder
的时候用try...catch
包住是确保应用程序从开启到结束都有日志输出,包括启动失败,最后Log.CloseAndFlush()
表示应用程序结束时会释放日志资源
UseSerilog
表示正式引入Serilog
组件,dispose:true
表示应用程序关闭之后会自动释放日志资源
修改appsettings.json
文件 在appsettings.json
文件中新增Serilog
节点,具体内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 { "Logging" : { "LogLevel" : { "Default" : "Information" , "Microsoft" : "Warning" , "Microsoft.Hosting.Lifetime" : "Information" } }, "Serilog" : { "MinimumLevel" : { "Default" : "Information" , "Override" : { "Microsoft" : "Information" , "System" : "Information" } } }, "AllowedHosts" : "*" }
输出日志 在WeatherForecastController.Get
方法中新增以下代码:
1 _logger.LogInformation("This is information log" );
运行项目,可以看到控制台打印出了结构化的日志,同时在项目根目录也有一个logs
文件夹,进入文件夹可以看到日志文件