使用 LogProperties source generator 豐富日誌

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中看到生成的代碼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章