当前位置:网站首页>asp.net core中使用Serilog以及自定义Enricher

asp.net core中使用Serilog以及自定义Enricher

2020-11-09 22:37:00 程序猿欧文

Serilog简介

与其他许多.NET库一样,Serilog还提供了对文件,控制台等的基本诊断日志记录。它易于设置,具有简洁的API,并且可以在最新的.NET平台之间移植。

使用和配置、自定义Enricher

由于 serilog 配置信息比较多,避免硬编码代码中,我们在 appsetting.jgon 同级目录中新建一个 serilogsetting.json 的日志配置文件,简单内容如下:

{	"Serilog": {		"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.Seq" ],		"MinimumLevel": {			"Default": "Information",			"Override": {				"System": "Error",				"Microsoft": "Error"			}		},		"WriteTo": [			{				"Name": "Console"			},			{				"Name": "Seq",				"Args": {					"serverUrl": "http://localhost:5341/",					"apiKey": "L2on8gpgjose5uldhdch"				}			}		]	}}

更多配置内容请参考:serilog wiki 文档

接下来,在 Program.cs 中添加一个方法,初始化这些配置,然后重写下构建主机的代码:

public class Program{ public static int Main(string[] args) {  var logConfig = GetLogConfig();  Log.Logger = new LoggerConfiguration()      .ReadFrom.Configuration(logConfig)      .Enrich.FormLogContext()      .CreateLogger();   try  {   // web host 初始化   var host = BuildWebHost(args);   host.Run();   return 0;  }  catch(Exception e)  {   Log.Fatal(ex, "{ApplicationContext} 出现错误:{messsage} !", AppName, ex.Message);   return 1;  }  finally  {   Log.CloseAndFlush();  } }  /// <summary> /// 读取日志配置 /// </summary> /// <returns></returns> private static IConfiguration GetLogConfig() {  var builder = new ConfigurationBuilder()      .AddJsonFile("serilogsetting.json", optional: false, reloadOnChange: true);  return builder.Build();  }}

然后,添加一个自定义Enircher,用来记录HttpContext,的数据。_enrichAction则可以自定义,默认记录ip,请求路径,请求方法,和返回响应码:

public class HttpContextEnricher:ILogEventEnricher{ private readonly IServiceProvider _serviceProvider; private readonly Action<LogEvent, ILogEventPropertyFactory, HttpContext> _enrichAction;  public HttpContextEnricher(IServiceProvider serviceProvider) : this(serviceProvider, null) {}   public HttpContextEnricher(IServiceProvider serviceProvider, Action<LogEvent, ILogEventPropertyFactory, HttpContext> enrichAction) {  _serviceProvider = serviceProvider;  if (enrichAction == null)  {   _enrichAction = (logEvent, pr.........

版权声明
本文为[程序猿欧文]所创,转载请带上原文链接,感谢
https://my.oschina.net/mikeowen/blog/4710338