LoggerMessageAttribute 高性能的日记记录

打印 上一主题 下一主题

主题 986|帖子 986|积分 2958

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
.NET 6 引入了 LoggerMessageAttribute 类型。 使用时,它会以source-generators的方式天生高性能的日记记录 API。
source-generators可在编译代码时,可以提供其他源代码作为编译的输入。
LoggerMessageAttribute依靠于 ILogger 接口和 LoggerMessage.Define 功能。
在 partial 日记记录方法上使用 LoggerMessageAttribute 时,体系会触发源天生器。 触发后,它既可以自动天生其修饰的 partial 方法的实现,也可以天生包含正确用法提示的编译时诊断。
与现有的日记记录方法相比,编译时日记记录解决方案在运行时通常要快得多。 这是因为它最大限度地消除了装箱、临时分配和副本。
 
基本用法
使用 LoggerMessageAttribute 时,类和方法必须为 partial。 真实记录日记的代码天生器在编译时触发,并天生 partial 方法的实现。
  1. public static partial class Log
  2. {
  3.     [LoggerMessage(
  4.         EventId = 0,
  5.         Level = LogLevel.Error,
  6.         Message = "Can not open SQL connection {err}")]
  7.     public static partial void CouldNotOpenConnection(this ILogger logger, string err);
  8. }
复制代码
在上面的示例中,日记记录方法为 static,日记级别在属性定义中指定,并使用 this 关键字将方法定义为扩展方法。
在调用时,可按常规方式调用即可
  1. internal class Program
  2. {
  3.     private static async Task Main(string[] args)
  4.     {
  5.         using ILoggerFactory loggerFactory = LoggerFactory.Create(
  6.             builder =>
  7.             builder.AddJsonConsole(
  8.                 options =>
  9.                 options.JsonWriterOptions = new JsonWriterOptions()
  10.                 {
  11.                     Indented = true
  12.                 }));
  13.         ILogger logger = loggerFactory.CreateLogger("Program");
  14.         logger.CouldNotOpenConnection("network err");
  15.     }
  16. }
复制代码

 
使用规则
在日记记录方法上使用 LoggerMessageAttribute 时,必须遵照一些规则:

  • 日记记录方法必须为 partial 并返回 void。
  • 日记记录方法名称不得以下划线开头。
  • 日记记录方法的参数名称不得以下划线开头。
  • 日记记录方法不得在嵌套类型中定义。
  • 日记记录方法不能是泛型方法。
  • 如果日记记录方法是 static,则需要 ILogger 实例作为参数。
代码天生模子依靠于使用新式 C# 编译器 9 或更高版本编译的代码。 .NET 5 提供了 C# 9.0 编译器。 若要升级到新式 C# 编译器,请编辑项目文件以面向 C# 9.0。 
 
好处
使用源天生器方法有几个主要好处:

  • 允许保存日记记录结构,并启用消息模板所需的确切格式语法。
  • 允许为模板占位符提供替换名称,允许使用格式说明符。
  • 允许按原样转达所有原始数据,在对其进行处理惩罚之前,不需要进行任何复杂的存储(除了创建 string)。
  • 提供特定于日记记录的诊断,针对重复的变乱 ID 发出告诫。
 
https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/
https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/partial-method
https://learn.microsoft.com/zh-cn/dotnet/core/extensions/logger-message-generator

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表