首页 > 其他分享 >使用 LogProperties source generator 丰富日志

使用 LogProperties source generator 丰富日志

时间:2024-03-18 09:12:47浏览次数:21  
标签:generator err source LogProperties 日志 public

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

 

标签:generator,err,source,LogProperties,日志,public
From: https://www.cnblogs.com/chenyishi/p/18078355

相关文章

  • 使用 JUnit 5.7 进行参数化测试:深入了解 @EnumSource
    使用JUnit5.7进行参数化测试:深入了解@EnumSource        参数化测试允许开发人员使用一系列输入值高效地测试他们的代码。在JUnit测试领域,经验丰富的用户长期以来一直在努力解决实施这些测试的复杂问题。但随着JUnit5.7的发布,测试参数化进入了一个新时代,为开发......
  • .Net Core 你必须知道的source-generators
    源生成器是C#9中引入的一项功能,允许在编译过程中动态生成代码。它们直接与C#编译器集成(Roslyn)并在编译时运行,分析源代码并根据分析结果生成附加代码。源生成器提供了一种简化的自动化代码生成方法,无需外部工具或单独的预编译步骤。通过无缝集成到编译过程中,源生成器可......
  • 【spring】@PropertySource 注解学习
    @PropertySource介绍@PropertySource是Spring框架中的一个注解,主要用于Java配置类中,用于引入额外的属性文件,以便在Spring应用上下文中使用这些属性。在Spring3.1引入Java配置后,我们可以通过@Configuration注解的类和@Bean注解的方法来进行组件扫描和依赖注入配置。但是,对于......
  • SourceTree提示Authentication failed for 如何解决
    sourcetree拉取失败提示Authenticationfailed(下图)1、关闭sourcetree;2、打开文件目录C:\Users\****\AppData\Local\Atlassian\SourceTree,删除passwd文件;3、打开sourcetree,点击拉取,就会弹出身份验证窗口,输入完成点击login即可拉取成功; ......
  • 你是怎么理解ES6中 Generator的?使用场景?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、介绍Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同回顾下上文提到的解决异步的手段:回调函数promise那么,上文我们提到promsie已经是一种比较流行的解决异步方案,那么为什么......
  • DiagnosticSource DiagnosticListener 无侵入式分布式跟踪
    ASP.NETCore中的框架中发出大量诊断事件,包括当前请求进入请求完成事件,HttpClient发出收到与响应,EFCore查询等等。我们可以利用DiagnosticListener来选择性地监听这些事件,然后通过自己的方式组织这些日志,实现无侵入的分布式跟踪。下面我们通过DiagnosticSource监听EFCore,与HTTP......
  • [Javascript] Generator & Iterators exercise
    Generatorcanrunwithfor..ofand...,whichwillonlyemityieldvalues Forexample:function*count(){yield1;yield2;return3;}for(constvalueofcount()){console.log(value)//1,2}console.log([...count()])//[1,2] ......
  • 关于failed to load resource 问题的处理
    问题:c++做插件,写了一个nativeclass,继承于ue的类ActorComponent,而蓝图里也继承了这个c++class,都在插件里,每次打开的时候就有这个错误:之前的解决办法,复制文件到桌面上,然后删除本地这个文件,涉及到这个类的在做做改动,工作量挺大的,之前基于这个插件做了不少逻辑,所以要改动很久。......
  • .Net Core中使用DiagnosticSource进行日志记录
    System.Diagnostics.DiagnosticSource可以丰富地记录程序中地日志,包括不可序列化的类型(例如HttpResponseMessage或HttpContext)。System.Diagnostics.DiagnosticSource通过订阅发布模式运行,我们可以根据自己地需要发现数据源并订阅感兴趣的数据源。 DiagnosticSource与......
  • [论文速览] CalliGAN@ Style and Structure-aware Chinese Calligraphy Character Gen
    Pretitle:CalliGAN:StyleandStructure-awareChineseCalligraphyCharacterGeneratoraccepted:AICCW(theAIforcontentcreationworkshop)atCVPR2020paper:https://arxiv.org/abs/2005.12500code:https://github.com/JeanWU/CalliGANref:https://blog.cs......