使用 LogProperties source generator 丰富日志

打印 上一主题 下一主题

主题 828|帖子 828|积分 2484

Nuget包 Microsoft.Extensions.Telemetry.Abstractions 包含的新的日志记载source generator,它支持使用[LogProperties]将整个对象作为State与日志一起记载。
我将展示一种方法来控制如何使用[LogProperties]对象自动丰富日志。
示例
您可以使用日志source generator创建一个如下所示的方法,并使用[LoggerMessage]属性对其进行装饰:
  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. }
  9. private static async Task Main(string[] args)
  10. {
  11.     using ILoggerFactory loggerFactory = LoggerFactory.Create(
  12.         builder =>
  13.         builder.AddJsonConsole(
  14.             options =>
  15.             options.JsonWriterOptions = new JsonWriterOptions()
  16.             {
  17.                 Indented = true
  18.             }));
  19.     ILogger logger = loggerFactory.CreateLogger("Program");
  20.     logger.CouldNotOpenConnection("network err");
  21. }
复制代码
 
您也可以传递[LogProperties]对象装饰的对象,它们将与您的消息一起记载。
使用前安装nuget包。
  1. [/code] 
  2. 然后定义一个记载日志方法,将一个对象传递给日志方法,并用LogProperties装饰:
  3. [code]public class NetWorkInfo
  4. {
  5.     public string IPAddress { get; set; }
  6.     public int Port { get; set; }
  7. }
  8. public static partial class Log
  9. {
  10.     [LoggerMessage(
  11.         EventId = 0,
  12.         Level = LogLevel.Error,
  13.         Message = "Can not open SQL connection {err}")]
  14.     public static partial void CouldNotOpenConnection(this ILogger logger, string err, [LogProperties] NetWorkInfo netWork);
  15. }
  16. logger.CouldNotOpenConnection("network err", new NetWorkInfo { IPAddress = "123.1.1", Port = 7777 });
复制代码
 
运行可以看到新增的Netwrok所有属性都会添加到消息的State属性中:

 
忽略属性
如果您不想在日志中包括[LogProperties]对象的特定属性,可以使用[LogPropertyIgnore]对其进行装饰:
  1. public class NetWorkInfo
  2. {
  3.     public string IPAddress { get; set; }
  4.     //从日志中移除
  5.     [LogPropertyIgnore]
  6.     public int Port { get; set; }
  7. }
复制代码

 
原理
其原理也是使用的source generator,可在vs中看到生成的代码

 

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

魏晓东

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