.NET 6 中的 Logging Source Generator

.NET 6 中的 Logging Source Generator

Intro

Logging source generator 是 .NET 6 引入的一个新功能,借助 Source Generator 来实现,因为要用到 C# 9 中的分部方法(partial method),C# 语言需要使用 9 及以上版本,具有更好的性能以及灵活性,在注重性能的项目中值得一试。

Static usage sample

类库里的日志通常会使用静态方法,将日志统一组织在一个静态类中,类似于下面这样

public static void RequestLog(this ILogger logger, string requestLog) => logger.Log(LogLevel.Information,new EventId(1, "RequestLog"),requestLog);

这样以后就可以比较方便地进行 EventId 的管理,避免 EventId 重复导致冲突

使用 Logging Source Generator 之后可以变成下面这样:

[LoggerMessage(LogLevel = LogLevel.Information, EventId=1, EventName= "RequestLog", Message = "{requestLog}")]
public static void RequestLog(this ILogger logger, string requestLog);

更多使用示例:

[LoggerMessage(Level = LogLevel.Information, EventId = 0, Message = "Logging generator sample begin")]
public static partial void TestBegin(this ILogger logger);[LoggerMessage(Level = LogLevel.Information, EventId = 1, Message = "Logging generator sample end", SkipEnabledCheck = true)]
public static partial void TestEnd(this ILogger logger);[LoggerMessage(EventId = 2, Message = "Logging generator sample user {userName}")]
public static partial void TestWithArgument(this ILogger logger, LogLevel logLevel, string userName);// warning SYSLIB1015: Argument 'host' is not referenced from the logging message
[LoggerMessage(EventId = 3)]
public static partial void TestWithEmptyMessage(this ILogger logger, LogLevel logLevel, string host);[LoggerMessage(EventId = 9,Level = LogLevel.Trace,Message = "Fixed message",EventName = "CustomEventName")]
public static partial void LogWithCustomEventName(this ILogger logger);

这里的静态方法作为了扩展方法使用,也可以不作为扩展方法来使用,可以根据自己需要和习惯来选择

使用示例:

var loggerFactory = LoggerFactory.Create(builder => builder.AddJsonConsole(options =>{options.JsonWriterOptions = new JsonWriterOptions(){Indented = true,Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping};}));var logger = loggerFactory.CreateLogger<LoggingGeneratorSample>();
logger.TestBegin();
logger.TestWithArgument(LogLevel.Warning, Environment.UserName);
logger.TestWithEmptyMessage(LogLevel.Information, Environment.MachineName);
logger.TestEnd();

这里的示例为了方便展示,配置输出格式为带缩进的 JSON 格式,输出结果如下:

82670a57761e48e40f73fc1b2ecacd76.png

Instance usage sample

除了作为静态方法使用,我们也可以作为实例方法去使用,不需要关注 EventId 的日志记录可能会使用的比较多,下面是一个示例:

// instance logging test
new InstanceLoggingGenerator(logger).LoggingTest();internal partial class InstanceLoggingGenerator
{private readonly ILogger _logger;public InstanceLoggingGenerator(ILogger logger){_logger = logger;}[LoggerMessage(EventId = 0, EventName = "Test", Level = LogLevel.Information, Message = "Instance logging generator test")]public partial void LoggingTest();
}

输出结果如下:

c0b6806bb4d7f93fb54acd0803e52d5b.png

实例方法中使用可以不传 ILogger 实例,会自动从类型中寻找 ILogger 类型的字段,可以想一下如果类型中有多个 ILogger 字段会怎么样?如果没有的话又会怎么样呢?可以自己实践一下

More

现在 ASP.NET Core 里有很多地方都已经在用了新的 Source Generator 的方式来记录日志,不妨也在自己的系统中试一下吧

目前我们日志里的 Message 中的参数还是要写模板传参数,以后可能就可以直接写一个插值字符串,由编译器去提取消息模板和参数,目前还不支持,可以参考设计文档:https://github.com/dotnet/designs/blob/main/accepted/2021/logging-generator.md

References

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/net6sample/GeneratorSample/LoggingGeneratorSample.cs

  • https://docs.microsoft.com/en-us/dotnet/core/extensions/logger-message-generator

  • https://github.com/dotnet/designs/blob/main/accepted/2021/logging-generator.md

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

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

相关文章

电脑内部录音教程Virtual Audio Cable使用教程

1:下载Virtual Audio Cable2&#xff1a;安装Virtual Audio Cable3&#xff1a;设置&#xff08;注意这里line1不要开启监听其他设备&#xff09;3&#xff1a;打开声音传输通道软件C:\Program Files\Virtual Audio Cable\audiorepeater.exe点击start启动&#xff0c;最小化。4…

战队口号霸气押韵8字_高考励志班级口号霸气押韵大全

【导语】高考没有什么可怕的&#xff0c;一定要保证心态好&#xff0c;就可能考出比平时更好的成绩。下面是无忧考网分享的高考励志班级口号霸气押韵大全。欢迎阅读参考&#xff01;【篇一】高考励志班级口号霸气押韵1.激情澎湃&#xff0c;高考不败&#xff0c;斗志昂扬&#…

别说理科男不懂撩妹,这个老司机一生只爱两样:物理和18岁的少女

全世界只有3.14 % 的人关注了爆炸吧知识相信在很多人的眼中&#xff0c;科研人员都是正经和严肃的代名词。成就大&#xff0c;光芒大&#xff0c;仿佛天生圣人。但是超模君在和大家讲了这么多科学家的故事后&#xff0c;发现还是那句俗话说得好&#xff1a;科研是科研&#xff…

一条nginx命令引发的对于容器的思考

去年的时候写了一篇原创《前后端分离&#xff0c;如何在前端项目中动态插入后端API基地址&#xff1f;&#xff08;in docker&#xff09;》&#xff0c; 我自认为这篇生产实践是对大前端、 容器化、CI/CD的得意之作。对于前后端分离的web项目&#xff0c;在容器启动的瞬间&…

部门树形结构,使用Treeview控件显示部门

部门树形结构。设计张部门表用于存储部门编码、名称、上级部门id&#xff0c;使用Treeview控件显示部门树&#xff0c;并实现部门增删改、移动、折叠等功能。特别提示&#xff0c;部门有层级关系&#xff0c;可用donetbar的adtree控件 代码如下 1 using System;2 using System.…

移动端 登陆 模板 html_聚会邀请函请柬模板 免费设计制作生成

制作邀请函 请关注我们聚会并非你的个人发布会和生活成果展&#xff0c;而在于描绘经历了风雨沧桑的那道彩虹&#xff0c;世事变化&#xff0c;聚会不是为了显示某人身居高位&#xff0c;也不是衣锦还乡或日过斗金、大富大贵的炫耀&#xff0c;重温那充满梦想的花样年华&#x…

他们是你学生时期的噩梦,但现在你可以把他们按在墙上摩擦了……

全世界只有3.14 % 的人关注了爆炸吧知识用艺术家的眼光去看科学&#xff0c;用人生的角度去看艺术。——尼采看过日剧的朋友都不会陌生下面的场景&#xff1a;日本主妇会将存放在冰箱中的东西列出清单&#xff0c;然后用磁贴将之贴在冰箱门上。每次购物或煮食后&#xff0c;她们…

推荐系统相关算法(1):SVD

假如要预测Zero君对一部电影M的评分&#xff0c;而手上只有Zero君对若干部电影的评分和风炎君对若干部电影的评分&#xff08;包含M的评分&#xff09;。那么能预测出Zero君对M的评分吗&#xff1f;答案显然是能。最简单的方法就是直接将预测分定为平均分。不过这时的准确度就难…

vSphere日志分析器(vCenter Log Insight)安装、配置

很久没更新博客&#xff0c;最近在网上看到了1.0版本的vSphere分析器可下载并可测试&#xff0c;测试完后发觉以前人肉全手动分析log&#xff0c;看得眼前飘白雪的情况不会出现了。这里和大家分享一下。1 关于vCenter Log Insight当ESX/ESXi主机发生故障&#xff0c;很多用户或…

android开发将h5转换成pdf_一键将PDF转换成PPT,秒懂!

PDF因能良好的兼容各操作系统和软件版本的差异性&#xff0c;使得PDF文档在查阅播放的时候不影响排版变化&#xff0c;很多时候&#xff0c;我们因为工作上的需要&#xff0c;经常需要再次将PDF转换成PPT&#xff0c;那么怎样将PDF转换成PPT呢&#xff1f;需要下载专业的转换工…

MongoDB 权限认证

MongoDB已经使用很长一段时间了&#xff0c;基于MongoDB的数据存储也一直没有使用到权限访问&#xff08;MongoDB默认设置为无权限访问限制&#xff09;&#xff0c;因为考虑到数据安全的原因特地花了一点时间研究了一下&#xff0c;网上搜出来的解决方法大都是3.0以下的版本的…

推荐系统相关算法(2):k-nearest neighbor

1. kNN 1.1 基本的kNN模型 kNN(k-nearest neighbor)的思想简单来说就是&#xff0c;要评价一个未知的东西U&#xff0c;只需找k个与U相似的已知的东西&#xff0c;并通过k个已知的&#xff0c;对U进行评价。假如要预测风炎君对一部电影M的评分&#xff0c;根据kNN的思想&#…

看了《OCP/OCA认证考试指南全册:Oracle Database 11g(1Z0-051,...

为什么80%的码农都做不了架构师&#xff1f;>>> 一直对考试用书没好感&#xff0c;觉得里边的内容都刻板不实用。在查找Oracle书籍时&#xff0c;无意中看到有人在豆瓣里说&#xff0c;如果给他一次重新的机会&#xff0c;他只看OCP 052、053&#xff0c;Oracle编程…

.net 集合分成几个等数量集合_巧用数学游戏,帮助幼儿轻松掌握12种数量关系!...

网校在手 轻松教研线上学习灵活高效海量资源轻松获取一键搞定园本教研感知数量关系是幼儿园数学教育的核心内容&#xff0c;是发展幼儿数学思维的重要因素。那么&#xff0c;孩子在幼儿园阶段需要了解哪些数量关系呢&#xff1f;幼儿园有哪些数学教育内容包含着数量关系呢&…

我做的百度飞桨PaddleOCR .NET调用库

.NET Conf 2021中国我做了一次《.NET玩转计算机视觉OpenCV》的分享&#xff0c;其中提到了一个效果特别好的OCR识别引擎——百度飞桨PaddleOCR&#xff0c;后来我逐步把它封装了一下&#xff0c;代码全部开源&#xff08;可点击查看原文跳转到Github&#xff09;&#xff1a;ht…

超棒的在线Bootstrap主题编辑工具 - lollytin

lollytin 是一款帮助制作Bootstrap3主题的在线工具&#xff0c;虽然现在仍旧是Beta版本&#xff0c;但是已经非常不错了。 主要功能&#xff1a; 通过拖拽来生成主题支持拖拽页头&#xff0c;页脚&#xff0c;内容&#xff0c;幻灯&#xff0c;地图&#xff0c;表单&#xff0c…

CentOS 5.9 yum安装LAMP(Apache+MySQL+PHP)

2019独角兽企业重金招聘Python工程师标准>>> 1、 yum -y install mysql mysql-server /*yum安装MySQL*/ 2、chkconfig --levels 235 mysqld on /*设置开机启动*/ 3、以MySQL用户root登陆: mysql -u root 登陆后设置root密码&#xff1a; set password for rootl…