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

Intro

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

实现代码

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, propertyFactory, httpContext) =>{logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", httpContext.GetUserIP()));logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestPath", httpContext.Request.Path));logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestMethod", httpContext.Request.Method));logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("Referer", httpContext.Request.Headers["Referer"].ToString()));};}else{_enrichAction = enrichAction;}}public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory){var httpContext = _serviceProvider.GetService<IHttpContextAccessor>()?.HttpContext;if (null != httpContext){_enrichAction.Invoke(logEvent, propertyFactory, httpContext);}}
}
public static class EnricherExtensions
{public static LoggerConfiguration WithHttpContextInfo(this LoggerEnrichmentConfiguration enrich, IServiceProvider serviceProvider){if (enrich == null)throw new ArgumentNullException(nameof(enrich));return enrich.With(new HttpContextEnricher(serviceProvider));}public static LoggerConfiguration WithHttpContextInfo(this LoggerEnrichmentConfiguration enrich, IServiceProvider serviceProvider, Action<LogEvent, ILogEventPropertyFactory, HttpContext> enrichAction){if (enrich == null)throw new ArgumentNullException(nameof(enrich));return enrich.With(new HttpContextEnricher(serviceProvider, enrichAction));}
}

使用方式

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

logFactory.AddSerilog(loggingConfig =>
{loggingConfig.Enrich.FromLogContext().Enrich.WithHttpContextInfo(app.ApplicationServices, (logEvent, propertyFactory, httpContext) =>{logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", httpContext.GetUserIP()));logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestPath", httpContext.Request.Path));logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestMethod", httpContext.Request.Method));logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("Referer", httpContext.Request.Headers["Referer"].ToString()));if (httpContext.Response.HasStarted){logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("ResponseStatus", httpContext.Response.StatusCode));}});var esConnString = Configuration.GetConnectionString("ElasticSearch");if (esConnString.IsNotNullOrWhiteSpace()){loggingConfig.WriteTo.Elasticsearch(esConnString,$"logstash-{ApplicationHelper.ApplicationName.ToLower()}");}
})

使用效果

More

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

Reference

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

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

asp.net core 自定义基于 HttpContext 的 Serilog Enricher相关推荐

  1. ASP.NET Core 实现基于 ApiKey 的认证

    ASP.NET Core 实现基于 ApiKey 的认证 Intro 之前我们有介绍过实现基于请求头的认证,今天来实现一个基于 ApiKey 的认证方式,使用方式参见下面的示例 Sample 注册认证 ...

  2. asp.net core 自定义异常处理中间件

    Intro 在 asp.net core 中全局异常处理,有时候可能不能满足我们的需要,可能就需要自己自定义一个中间件处理了,最近遇到一个问题,有一些异常,不希望记录错误日志,目前主要是用户请求取消导 ...

  3. ASP.NET Core开发之HttpContext

    ASP.NET Core中的HttpContext开发,在ASP.NET开发中我们总是会经常用到HttpContext. 那么在ASP.NET Core中要如何使用HttpContext呢,下面就来具 ...

  4. asp.net core 自定义 Policy 替换 AllowAnonymous 的行为

    asp.net core 自定义 Policy 替换 AllowAnonymous 的行为 Intro 最近对我们的服务进行了改造,原本内部服务在内部可以匿名调用,现在增加了限制,通过 identit ...

  5. 解决 ASP.NET Core 自定义错误页面对 Middleware 异常无效的问题

    我们基于 Razor Class Library 实现了自定义错误页面的公用类库(详见之前的随笔),但是在实际使用时发现如果在 middleware 中发生了异常,则不能显示自定义错误页面,而是返回默 ...

  6. ASP.NET Core自定义响应内容

    问题 在业务开发中,对Web API的返回格式有一定要求,需要是定制化的Json结构,用于前端统一处理: {Status : 0,Message: "",Info : xxx } ...

  7. asp.net core 自定义 Content-Type

    asp.net core 实现支持自定义 Content-Type Intro 我们最近有一个原本是内网的服务要上公网,在公网上有一层 Cloudflare 作为网站的公网流量提供者,CloudFla ...

  8. asp.net core 自定义401和异常显示内容(JWT认证、Cookie Base认证失败显示内容)

    asp.net core 2.0使用JWT认证园子里已经有挺多帖子了,但开发中发现认证未授权情况下返回的401状态码是没有任何信息的,业务中可能有需要返回一串错误的Json信息.在这里我分享一个自定义 ...

  9. asp.net core自定义依赖注入容器,替换自带容器

    依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...

最新文章

  1. gradle多工程打包冲突问题
  2. jQuery中的$el是什么意思
  3. python爬虫可以干什么-Python 爬虫一 简介
  4. ABAP中的动态运算函数
  5. 人们对大数据的几点误解
  6. 用Python实现一个简单的智能换脸软件
  7. 【Linux网络编程】TCP 和 UDP 数据报格式详解
  8. Two Arrays(DP递推)
  9. prefix.pch文件的一些简单使用
  10. SSH整合所需的jar包
  11. 正态分布下贝叶斯决策的特例(三)
  12. 图解大数据 | 基于Spark RDD的大数据处理分析
  13. 智慧灯杆系统设计架构简介
  14. hecto - 手把手教你写个 文本编辑器
  15. 微型计算机是计算器吗,计算器和计算机的区别?
  16. 《中国垒球》:棍网球委员会·垒球联盟
  17. Java:一般数据结构
  18. linux下混杂模式
  19. 删除桌面快捷方式右键菜单中IObit Uninstaller的强力卸载
  20. java数据结构与算法面试,java面试手写代码

热门文章

  1. 设计模式之-命令模式(Command Pattern)
  2. linkbox php,win10 docker-toolsbox 搭建php开发环境的教程
  3. 读名老中医之路笔记(二)
  4. 免去架构算法调优,如何让你的系统风驰电掣?|图说
  5. std::bind 详解及参数解析
  6. Idea maven项目不能新建package和class的解决
  7. maven3安装和使用笔记
  8. 存储设备分区,格式化,挂载
  9. javascript高程3 学习笔记(三)
  10. java 类的加载、连接和初始化