暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用 LogProperties source generator 丰富日志

chester技术分享 2024-03-18
112

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

           

          关注我获取技术分享


          文章转载自chester技术分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论