大数跨境
0
0

asp.net core 自定义基于 HttpContext 的 Serilog Enricher

asp.net core 自定义基于 HttpContext 的 Serilog Enricher amazingdotnet
2019-12-27
0
导读:asp.net core 自定义基于 HttpContext 的 Serilog Enricher

asp.net core 自定义基于 HttpContext 的 Serilog Enricher

Intro

通过 HttpContext 我们可以拿到很多有用的信息,比如 Path/QueryString/RequestHeader 等请求信息, StatusCode/ResponseHeader 等响应信息,借助 HttpContext 我们可以在日志中记录很多有用的信息,于是需要自定义一个基于 HttpContext 的 Enricher

实现代码

 
  1. public class HttpContextEnricher : ILogEventEnricher

  2. {

  3. private readonly IServiceProvider _serviceProvider;

  4. private readonly Action<LogEvent, ILogEventPropertyFactory, HttpContext> _enrichAction;


  5. public HttpContextEnricher(IServiceProvider serviceProvider) : this(serviceProvider, null)

  6. {

  7. }


  8. public HttpContextEnricher(IServiceProvider serviceProvider, Action<LogEvent, ILogEventPropertyFactory, HttpContext> enrichAction)

  9. {

  10. _serviceProvider = serviceProvider;

  11. if (enrichAction == null)

  12. {

  13. _enrichAction = (logEvent, propertyFactory, httpContext) =>

  14. {

  15. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", httpContext.GetUserIP()));

  16. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestPath", httpContext.Request.Path));

  17. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestMethod", httpContext.Request.Method));


  18. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("Referer", httpContext.Request.Headers["Referer"].ToString()));

  19. };

  20. }

  21. else

  22. {

  23. _enrichAction = enrichAction;

  24. }

  25. }


  26. public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)

  27. {

  28. var httpContext = _serviceProvider.GetService<IHttpContextAccessor>()?.HttpContext;

  29. if (null != httpContext)

  30. {

  31. _enrichAction.Invoke(logEvent, propertyFactory, httpContext);

  32. }

  33. }

  34. }


  35. public static class EnricherExtensions

  36. {

  37. public static LoggerConfiguration WithHttpContextInfo(this LoggerEnrichmentConfiguration enrich, IServiceProvider serviceProvider)

  38. {

  39. if (enrich == null)

  40. throw new ArgumentNullException(nameof(enrich));


  41. return enrich.With(new HttpContextEnricher(serviceProvider));

  42. }


  43. public static LoggerConfiguration WithHttpContextInfo(this LoggerEnrichmentConfiguration enrich, IServiceProvider serviceProvider, Action<LogEvent, ILogEventPropertyFactory, HttpContext> enrichAction)

  44. {

  45. if (enrich == null)

  46. throw new ArgumentNullException(nameof(enrich));


  47. return enrich.With(new HttpContextEnricher(serviceProvider, enrichAction));

  48. }

  49. }

使用方式

上面的 Enricher 允许我们定义了一个委托来自定义加从 HttpContext 中添加一些我们想要记录的信息了

 
  1. logFactory.AddSerilog(loggingConfig =>

  2. {

  3. loggingConfig

  4. .Enrich.FromLogContext()

  5. .Enrich.WithHttpContextInfo(app.ApplicationServices, (logEvent, propertyFactory, httpContext) =>

  6. {

  7. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", httpContext.GetUserIP()));

  8. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestPath", httpContext.Request.Path));

  9. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestMethod", httpContext.Request.Method));


  10. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("Referer", httpContext.Request.Headers["Referer"].ToString()));

  11. if (httpContext.Response.HasStarted)

  12. {

  13. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("ResponseStatus", httpContext.Response.StatusCode));

  14. }

  15. })

  16. ;


  17. var esConnString = Configuration.GetConnectionString("ElasticSearch");

  18. if (esConnString.IsNotNullOrWhiteSpace())

  19. {

  20. loggingConfig.WriteTo.Elasticsearch(esConnString,

  21. $"logstash-{ApplicationHelper.ApplicationName.ToLower()}");

  22. }

  23. })

使用效果

More

上面的扩展可以自行修改,自己用的顺手就好~~

Reference

  • https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation/Startup.cs

  • https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation/SerilogEnrichers/HttpContextEnricher.cs


【声明】内容源于网络
0
0
amazingdotnet
dotnet 开发知识库,了不起的 dotnet,dotnet 奇淫怪巧
内容 539
粉丝 0
amazingdotnet dotnet 开发知识库,了不起的 dotnet,dotnet 奇淫怪巧
总阅读27
粉丝0
内容539