使用 LogProperties source generator 丰富日志

  • 使用 LogProperties source generator 丰富日志已关闭评论
  • 38 次浏览
  • A+
所属分类:.NET技术
摘要

Nuget包 Microsoft.Extensions.Telemetry.Abstractions 包含的新的日志记录source generator,它支持使用[LogProperties]将整个对象作为State与日志一起记录。

Nuget包 Microsoft.Extensions.Telemetry.Abstractions 包含的新的日志记录source generator,它支持使用[LogProperties]将整个对象作为State与日志一起记录。

我将展示一种方法来控制如何使用[LogProperties]对象自动丰富日志。

示例

您可以使用日志source generator创建一个如下所示的方法,并使用[LoggerMessage]属性对其进行装饰:

public static partial class Log {     [LoggerMessage(         EventId = 0,         Level = LogLevel.Error,         Message = "Can not open SQL connection {err}")]     public static partial void CouldNotOpenConnection(this ILogger logger, string err); }   private static async Task Main(string[] args) {     using ILoggerFactory loggerFactory = LoggerFactory.Create(         builder =>         builder.AddJsonConsole(             options =>             options.JsonWriterOptions = new JsonWriterOptions()             {                 Indented = true             }));      ILogger logger = loggerFactory.CreateLogger("Program");      logger.CouldNotOpenConnection("network err"); }

 

您也可以传递[LogProperties]对象装饰的对象,它们将与您的消息一起记录。

使用前安装nuget包。

<PackageReference Include="Microsoft.Extensions.Telemetry.Abstractions" Version="8.3.0" />

 

然后定义一个记录日志方法,将一个对象传递给日志方法,并用LogProperties装饰:

public class NetWorkInfo {     public string IPAddress { get; set; }     public int Port { get; set; } }  public static partial class Log {     [LoggerMessage(         EventId = 0,         Level = LogLevel.Error,         Message = "Can not open SQL connection {err}")]     public static partial void CouldNotOpenConnection(this ILogger logger, string err, [LogProperties] NetWorkInfo netWork); }  logger.CouldNotOpenConnection("network err", new NetWorkInfo { IPAddress = "123.1.1", Port = 7777 });

 

运行可以看到新增的Netwrok所有属性都会添加到消息的State属性中:

使用 LogProperties  source generator 丰富日志

 

忽略属性

如果您不想在日志中包括[LogProperties]对象的特定属性,可以使用[LogPropertyIgnore]对其进行装饰:

public class NetWorkInfo {     public string IPAddress { get; set; }     //从日志中移除     [LogPropertyIgnore]     public int Port { get; set; } }

使用 LogProperties  source generator 丰富日志

 

原理

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

使用 LogProperties  source generator 丰富日志