asp.net core 自定义基于 HttpContext 的 Serilog Enricher
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相关推荐
- ASP.NET Core 实现基于 ApiKey 的认证
ASP.NET Core 实现基于 ApiKey 的认证 Intro 之前我们有介绍过实现基于请求头的认证,今天来实现一个基于 ApiKey 的认证方式,使用方式参见下面的示例 Sample 注册认证 ...
- asp.net core 自定义异常处理中间件
Intro 在 asp.net core 中全局异常处理,有时候可能不能满足我们的需要,可能就需要自己自定义一个中间件处理了,最近遇到一个问题,有一些异常,不希望记录错误日志,目前主要是用户请求取消导 ...
- ASP.NET Core开发之HttpContext
ASP.NET Core中的HttpContext开发,在ASP.NET开发中我们总是会经常用到HttpContext. 那么在ASP.NET Core中要如何使用HttpContext呢,下面就来具 ...
- asp.net core 自定义 Policy 替换 AllowAnonymous 的行为
asp.net core 自定义 Policy 替换 AllowAnonymous 的行为 Intro 最近对我们的服务进行了改造,原本内部服务在内部可以匿名调用,现在增加了限制,通过 identit ...
- 解决 ASP.NET Core 自定义错误页面对 Middleware 异常无效的问题
我们基于 Razor Class Library 实现了自定义错误页面的公用类库(详见之前的随笔),但是在实际使用时发现如果在 middleware 中发生了异常,则不能显示自定义错误页面,而是返回默 ...
- ASP.NET Core自定义响应内容
问题 在业务开发中,对Web API的返回格式有一定要求,需要是定制化的Json结构,用于前端统一处理: {Status : 0,Message: "",Info : xxx } ...
- asp.net core 自定义 Content-Type
asp.net core 实现支持自定义 Content-Type Intro 我们最近有一个原本是内网的服务要上公网,在公网上有一层 Cloudflare 作为网站的公网流量提供者,CloudFla ...
- asp.net core 自定义401和异常显示内容(JWT认证、Cookie Base认证失败显示内容)
asp.net core 2.0使用JWT认证园子里已经有挺多帖子了,但开发中发现认证未授权情况下返回的401状态码是没有任何信息的,业务中可能有需要返回一串错误的Json信息.在这里我分享一个自定义 ...
- asp.net core自定义依赖注入容器,替换自带容器
依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...
最新文章
- gradle多工程打包冲突问题
- jQuery中的$el是什么意思
- python爬虫可以干什么-Python 爬虫一 简介
- ABAP中的动态运算函数
- 人们对大数据的几点误解
- 用Python实现一个简单的智能换脸软件
- 【Linux网络编程】TCP 和 UDP 数据报格式详解
- Two Arrays(DP递推)
- prefix.pch文件的一些简单使用
- SSH整合所需的jar包
- 正态分布下贝叶斯决策的特例(三)
- 图解大数据 | 基于Spark RDD的大数据处理分析
- 智慧灯杆系统设计架构简介
- hecto - 手把手教你写个 文本编辑器
- 微型计算机是计算器吗,计算器和计算机的区别?
- 《中国垒球》:棍网球委员会·垒球联盟
- Java:一般数据结构
- linux下混杂模式
- 删除桌面快捷方式右键菜单中IObit Uninstaller的强力卸载
- java数据结构与算法面试,java面试手写代码