Nuget包 Microsoft.Extensions.Telemetry.Abstractions 包含的新的日誌記錄source generator,它支持使用[LogProperties]將整個對象作為State與日誌一起記錄。 我將展示一種方法來控制如何使用[LogProperties]對象 ...
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]對象的特定屬性,可以使用[LogPropertyIgnore]對其進行裝飾:
public class NetWorkInfo { public string IPAddress { get; set; } //從日誌中移除 [LogPropertyIgnore] public int Port { get; set; } }
原理
其原理也是使用的source generator,可在vs中看到生成的代碼