Serilog 自定义 Enricher 来增加记录的信息

Serilog 自定义 Enricher 来增加记录的信息

Intro

Serilog 是 .net 里面非常不错的记录日志的库,结构化日志记录,而且配置起来很方便,自定义扩展也很方便

Serilog is a diagnostic logging library for .NET applications. It is easy to set up, has a clean API, and runs on all recent .NET platforms. While it's useful even in the simplest applications, Serilog's support for structured logging shines when instrumenting complex, distributed, and asynchronous applications and systems.

Serilog是.NET应用程序的诊断日志库。它易于设置,具有干净的API,并可在所有最新的.NET平台上运行。虽然它在最简单的应用程序中也很有用,但Serilog对结构化日志记录的支持在处理复杂,分布式和异步应用程序和系统时仍然很有用。

之前一直使用 log4net 来记录日志,使用 serilog 之后觉得 serilog 比 log4net 好用很多,很灵活,配置方式多种多样,支持许多不同的输出,详细参考 https://github.com/serilog/serilog/wiki/Provided-Sinks

最近打算把之前基于 log4net 的日志迁移到 serilog, 我自定义的一套 logging 组件也增加了对 Serilog 的支持。https://www.nuget.org/packages/WeihanLi.Common.Logging.Serilog 现在还没有发布正式版,不过我已经在用了,在等 serilog 发布 2.9.0 正式版,因为 2.8.x 版本的 netstandard2.0 版本还依赖了一个 System.Collections.NonGeneric,这个依赖只在 netstandard1.3 的时候需要引用,netstandard2.0 已经不需要了,详细信息可以参考PR: https://github.com/serilog/serilog/pull/1342

自定义 Enricher

自定义 Enricher 很简单很方便,来看示例:

public class RequestInfoEnricher : ILogEventEnricher	
{	public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)	{	var httpContext = DependencyResolver.Current.GetService<IHttpContextAccessor>()?.HttpContext;	if (null != httpContext)	{	logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", httpContext.GetUserIP()));	logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestPath", httpContext.Request.Path));	logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("Referer", httpContext.Request.Headers["Referer"]));	}	}	
}

这个示例会尝试获取请求的 RequestIP/RequestPath/Referer 写入到日志中,这样可以方便我们的请求统计

为了方便使用我们可以再定义一个扩展方法:

public static class EnricherExtensions	
{	public static LoggerConfiguration WithRequestInfo(this LoggerEnrichmentConfiguration enrich)	{	if (enrich == null)	throw new ArgumentNullException(nameof(enrich));	return enrich.With<RequestInfoEnricher>();	}	
}

配置 Serilog :

loggingConfig	.WriteTo.Elasticsearch(Configuration.GetConnectionString("ElasticSearch"), $"logstash-{ApplicationHelper.ApplicationName.ToLower()}")	.Enrich.FromLogContext()	.Enrich.WithRequestInfo()

完整代码示例参考:https://github.com/WeihanLi/ActivityReservation/blob/e68ab090f8b7d660f0a043889f4353551c8b3dc2/ActivityReservation/SerilogEnrichers/RequestInfoEnricher.cs

验证

来看一下我们使用了我们自定义的 RequestInfoEnricher 之后的日志效果

640?wx_fmt=png

可以看到我们自定义的 Enricher 中添加的请求信息已经写到日志里了,而且我们可以根据 RequestIP 去筛选,为了方便查询 IP 统计,在 kibana 中加了一个可视化面板,效果如下图所示:

640?wx_fmt=png

Reference

  • https://github.com/serilog/serilog

  • https://github.com/WeihanLi/ActivityReservation/blob/e68ab090f8b7d660f0a043889f4353551c8b3dc2/ActivityReservation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Harbour.Space Scholarship Contest 2021-2022 F. Pairwise Modulo 逆向思维 + 树状数组

传送门 文章目录题意思路&#xff1a;题意 给定一个不同数组成的序列aaa&#xff0c;定义pkp_kpk​为pk∑i1k∑j1kaimodajp_k\sum_{i1}^k\sum_{j1}^ka_i\bmod a_jpk​∑i1k​∑j1k​ai​modaj​&#xff0c;让你对于每个i∈[1,n]i\in [1,n]i∈[1,n]求出pip_ipi​。 2≤n≤2e5,…

miller_rabin 证明与实现

143. 质数判定__模板题链接 前置知识 费马小定理&#xff1a;ppp是质数&#xff0c;则对于任意的aaa&#xff0c;aaa与ppp互质&#xff0c;则有ap−1≡1(modp)a ^ {p - 1} \equiv 1 \pmod {p}ap−1≡1(modp)。 二次探测定理&#xff1a;如果ppp是一个质数&#xff0c;x2≡1(…

基于@media (prefers-color-scheme: [dark|light])的暗黑与亮色主题切换

今天有人反馈使用pdf.js的时候&#xff0c;发现pdf.js阅读器在自己的Mac Book电脑上显示的背景是暗黑色&#xff0c;而别人的电脑上却是白色&#xff1a; 根据这个问题&#xff0c;找到了pdf.js使用的view.css有段代码&#xff0c;类似这样&#xff1a; media (prefers-color-…

做「容量预估」可没有true和false

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「85」篇原创敬上随着20年来互联网的蓬勃发展&#xff0c;一个软件系统所要面对的访问压力上限被逐渐提高。虽然如此&#xff0c;但是那些体量达到亿级或者是千万级…

P3396 哈希冲突 根号分治

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的数组aaa&#xff0c;每次操作有两种&#xff1a; (1)(1)(1) 给出x,yx,yx,y&#xff0c;问aaa中下表在模xxx的时候&#xff0c;模数等于yyy的位置aia_iai​之和。 (2)(2)(2) 给出x,yx,yx,…

miller_rabin 模板

miller_rabin 模板 ll quick_mult(ll a, ll b, ll mod) {ll ans 0;while(b) {if(b & 1) ans (ans a) % mod;a (a a) % mod;b >> 1;}return ans; }ll quick_pow(ll a, ll n, ll mod) {ll ans 1;while(n) {if(n & 1) ans quick_mult(ans, a, mod);a quick…

你不得不了解的10款服务器监控工具

监控Web服务器或Web主机的运行状况和正常运行非常重要。如果希望确保您的网站可用性在您的控制之中&#xff0c;那你就需要收集服务器各种性能数据以供分析和调整。以下是收集的常用大多数服务器监控组件解决方案。01Performance Co-PilotPerformance Co-Pilot&#xff0c;简称…

Codeforces Round #507 (Div. 1) D. You Are Given a Tree 根号分治 + dp

传送门 题意&#xff1a; 有一颗nnn个节点的树&#xff0c;其中一个简单路径集合被称为kkk合法当且仅当&#xff1a; 树的每个节点至多属于一条路径&#xff0c;且每条路径恰好包含kkk个点。 对于k∈[1,n]k\in [1,n]k∈[1,n]&#xff0c;求kkk合法路径集合最多路径个数&…

acwing199.余数之和(除法分块)

思路 要计算∑i1nk(modi)\sum _{i 1} ^ {n}k\pmod {i}∑i1n​k(modi)&#xff0c;可化简原式n∗k−∑i1nk/i∗i原式 n * k - \sum _{i 1} ^ {n} k / i * i原式n∗k−∑i1n​k/i∗i&#xff0c;显然k/ik / ik/i是一个具有块状性质的区间&#xff0c;我们给定了这个块状区间的…

2020EC-final

传送门 文章目录B - Rectangle Flip 2题意&#xff1a;思路&#xff1a;A - Namomo Subsequence题意&#xff1a;思路&#xff1a;D - City Brain题意:思路:B - Rectangle Flip 2 题意&#xff1a; 给你一个n∗mn*mn∗m的矩阵&#xff0c;接下来n∗mn*mn∗m秒每秒都会消失一个…

统一流控服务开源:基于.Net Core的流控服务

先前有一篇博文&#xff0c;梳理了流控服务的场景、业界做法和常用算法统一流控服务开源-1&#xff1a;场景&业界做法&算法篇最近完成了流控服务的开发&#xff0c;并在生产系统进行了大半年的验证&#xff0c;稳定可靠。今天整理一下核心设计和实现思路&#xff0c;开…

小A的柱状图

小A的柱状图 思路 经典的单调栈题目&#xff0c;对于每一个位置&#xff0c;我们维护他以当前高度可以到达的最左方&#xff0c;以及他当前高度可以到达的最有方&#xff0c;显然就有以他的高度的矩形块的面积就出来了&#xff0c;所以我们只需要统计n个矩形的最大值就行。 …

建筑师 第一类斯特林数

文章目录目录题意:思路&#xff1a;目录 题意: 给你一个nnn的排列&#xff0c;排列中的数代表他的高度&#xff0c;问你有多少个排列能使得从左边能看到aaa个建筑&#xff0c;从右边能看到bbb个建筑。 如果建筑iii左边没有任何比他高的&#xff0c;那么他就能看到。 1≤n≤5…

poj 3233 Matrix Power Series

Matrix Power Series 思路 题意比较简单&#xff0c;就是要求S(n)∑i1nAiS(n) \sum _{i 1} ^{n} A^ {i}S(n)∑i1n​Ai&#xff0c;显然有S(n)S(n−1)∗AAS(n) S(n - 1) * A AS(n)S(n−1)∗AA&#xff0c;看到这里&#xff0c;那就简单了&#xff0c;递推式&#xff0c;加…

.NET Core 编写 Azure Function 并连接 GitHub 持续部署

点击上方蓝字关注“汪宇杰博客”导语Azure Function 是一个事件驱动型无服务器计算平台&#xff0c;可以解决复杂的业务流程问题&#xff0c;更加高效地进行开发。在本地构建和调试&#xff0c;而无需额外的设置&#xff0c;在云中大规模部署和操作&#xff0c;并使用触发器和绑…

Codeforces Round #766 (Div. 2) D. Not Adding 数学gcd

传送门 文章目录目录题意&#xff1a;思路&#xff1a;目录 题意&#xff1a; 给你一个长度为nnn的数组&#xff0c;你每次可以选择其中的两个数&#xff0c;如果他们的gcdgcdgcd在数组中没有出现那么就可以加在数组后面构成一个新的数组&#xff0c;问数组最长是多少。 2≤n…

「数据ETL」从数据民工到数据白领蜕变之旅(五)-使用dotNET脚本实现SSIS无限扩展...

在前面一文中&#xff0c;正式引出了SSIS专业数据ETL工具&#xff0c;笔者仅能作引路作用&#xff0c;未能使用文章的方式给大家写出更多的入门级的文章&#xff0c;希望读者们可以自行根据分享的学习资源自行完成入门及进阶的学习。同时也想给大家分享到SSIS的能力边界性&…

P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索

传送门 文章目录目录题意&#xff1a;思路&#xff1a;目录 题意&#xff1a; 给你nnn个数&#xff0c;从中任意选出一组数&#xff0c;使这些数能分成和相等的两组&#xff0c;问有多少种选数方案。 2≤n≤20,1≤ai≤1e92\le n\le 20,1\le a_i\le 1e92≤n≤20,1≤ai​≤1e9 …

poj 2191 Mersenne Composite Numbers

思路 用pollard_rho miller_rabin来拆分数字&#xff0c;如果得到的质因子大于等于2的话就按照格式输出&#xff0c;否则就不是我们想要的梅森素数。 代码 /*Author : lifehappy */ // #pragma GCC optimize(2) // #pragma GCC optimize(3) // #include <bits/stdc.h>…

数据结构为什么那么难?

来源 | 异步 | 文末赠书2017年8月&#xff0c;本着让更多的人轻松学习算法的初心&#xff0c;我写作了第一本书《趣学算法》&#xff0c;该书在出版后受到广大读者一致好评&#xff0c;在一年内重印了10次&#xff0c;并输出了繁体版的版权。一位读者对我说&#xff0c;读这本书…