前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 LogProperties source generator 丰富日志

使用 LogProperties source generator 丰富日志

作者头像
Chester Chen
发布2024-03-25 13:59:38
750
发布2024-03-25 13:59:38
举报
文章被收录于专栏:chester技术分享chester技术分享

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

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

示例

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

代码语言:javascript
复制
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包。

代码语言:javascript
复制
<PackageReference Include="Microsoft.Extensions.Telemetry.Abstractions" Version="8.3.0" />

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

代码语言:javascript
复制
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]对其进行装饰:

代码语言:javascript
复制
public class NetWorkInfo
{
    public string IPAddress { get; set; }
    //从日志中移除
    [LogPropertyIgnore]
    public int Port { get; set; }
}

原理

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 chester技术分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档