首页 > 其他分享 >LoggerMessageAttribute 高性能的日志记录

LoggerMessageAttribute 高性能的日志记录

时间:2024-03-15 10:02:32浏览次数:17  
标签:partial 记录 高性能 static LoggerMessageAttribute 日志 方法

.NET 6 引入了 LoggerMessageAttribute 类型。 使用时,它会以source-generators的方式生成高性能的日志记录 API。

source-generators可在编译代码时,可以提供其他源代码作为编译的输入。

LoggerMessageAttribute依赖于 ILogger 接口和 LoggerMessage.Define 功能。

在 partial 日志记录方法上使用 LoggerMessageAttribute 时,系统会触发源生成器。 触发后,它既可以自动生成其修饰的 partial 方法的实现,也可以生成包含正确用法提示的编译时诊断。

与现有的日志记录方法相比,编译时日志记录解决方案在运行时通常要快得多。 这是因为它最大限度地消除了装箱、临时分配和副本。

 

基本用法

使用 LoggerMessageAttribute 时,类和方法必须为 partial。 真实记录日志的代码生成器在编译时触发,并生成 partial 方法的实现。

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);
}

在上面的示例中,日志记录方法为 static,日志级别在属性定义中指定,并使用 this 关键字将方法定义为扩展方法。

在调用时,可按常规方式调用即可

internal class Program
{
    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");
    }
}

 

使用规则

在日志记录方法上使用 LoggerMessageAttribute 时,必须遵循一些规则:

  • 日志记录方法必须为 partial 并返回 void。
  • 日志记录方法名称不得以下划线开头。
  • 日志记录方法的参数名称不得以下划线开头。
  • 日志记录方法不得在嵌套类型中定义。
  • 日志记录方法不能是泛型方法。
  • 如果日志记录方法是 static,则需要 ILogger 实例作为参数。

代码生成模型依赖于使用新式 C# 编译器 9 或更高版本编译的代码。 .NET 5 提供了 C# 9.0 编译器。 若要升级到新式 C# 编译器,请编辑项目文件以面向 C# 9.0。 

 

好处

使用源生成器方法有几个主要好处:

  • 允许保留日志记录结构,并启用消息模板所需的确切格式语法。
  • 允许为模板占位符提供替代名称,允许使用格式说明符。
  • 允许按原样传递所有原始数据,在对其进行处理之前,不需要进行任何复杂的存储(除了创建 string)。
  • 提供特定于日志记录的诊断,针对重复的事件 ID 发出警告。

 

https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/

https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/partial-method

https://learn.microsoft.com/zh-cn/dotnet/core/extensions/logger-message-generator

标签:partial,记录,高性能,static,LoggerMessageAttribute,日志,方法
From: https://www.cnblogs.com/chenyishi/p/18073599

相关文章

  • 14_学习日志_数据结构_冒泡排序_快速排序_插入排序
    #include<编织有意义的谎言,使我相信闭上眼再睁开眼时的世界是同一个>1.介绍    从后往前或者从前往后开始两两比较元素,使得最小数上浮或者最大数下沉为冒泡排序,快速排序利用分治思想,使得基准数左边都存放相对较小数,右边存放较大数,两边再按照同样的做法重复。插入排序......
  • 教程|腾讯云高性能应用服务(HAI)搭建多音色控制的TTS引擎
    在这篇文章中,我们将介绍如何使用腾讯云的高性能应用服务(HAI)来搭建一个具有多音色控制的文本转语音(TTS)引擎,具体操作步骤如下:登录高性能应用服务HAI控制台点击新建选择AI框架,选择算力方案、输入实例名称、选择数量后立即购买开启学术加速功能完成创建,查看运行状态......
  • journal日志管理
    目录1简介2语法3常用示例只查看内核日志查看系统启动日志查看指定时间的日志显示尾部指定行数日志实时滚动显示最新日志查看某个Unit的日志查看指定进程的日志查看某个路径的脚本的日志显示日志占据的硬盘空间指定日志文件占据的最大空间指定日志文件保存......
  • ELK日志处理部署笔记
    ELK概念简介ELK建立在三个服务上即Elasticsearch::日志检索和储存Logstash::日志收集分析处理Kibana::日志可视化Elasticsearch集群模式Elasticsearch采用了经典的raft模式,推荐将一部分专门配置为候选主节点(master-eligiblenodes),而另一部分节点则仅作为......
  • 2.4GHz小型超高性能模块:LBEE5XV2EA-802、LBEE5PA1LD-005、LBES5PL2EL-923、LBWA0ZZ2DS
    1、描述:2EA型是一款基于CYW55573组合芯片组的小型超高性能模块,支持Wi-Fi802.11a/b/g/n/AC/ax2×2MIMO蓝牙5.3BR/EDR/le高达1.2Gbps的Wi-FiPHY数据速率和3Mbps的传统蓝牙PHY数据速率(EDR)以及2Mbps的PHY蓝牙LE数据速率。WLAN部分支持PCIe3.0第二代和SDIO3.0接口,蓝牙部分支持......
  • MogDB openGauss wal日志解析工具 mog_xlogdump
    MogDB/openGausswal日志解析工具mog_xlogdump本文出处:https://www.modb.pro/db/398124概述mog_xlogdump是云和恩墨独立开发的wal日志离线解析工具。熟悉PG的小伙伴应该都使用pg_xlogdump/pg_waldump查看过PG数据库的wal文件,解析的wal数据结果是没有办法直接拿......
  • 京东广告算法架构体系建设--高性能计算方案最佳实践
    1、前言推荐领域算法模型的在线推理是一个对高并发、高实时有较强要求的场景。算法最初是基于Wide&Deep相对简单的网络结构进行建模,容易满足高实时、高并发的推理性能要求。但随着广告模型效果优化进入深水区,基于Transformer用户行为序列和Attention的建模逐渐成为主流,这个阶段......
  • 高性能计算——汇编语言(三)
    汇编语言(三)文章目录汇编语言(三)函数和递归(**FunctionsandRecursion**)栈(**TheStack**)**调用约定(CallingConventions)****内联(Inlining)****尾递归消除(TailCallElimination)**函数和递归(FunctionsandRecursion)在汇编语言中,“调用一个函数”,需要跳转......
  • Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)--稳定高质量文案生成器
    Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)--稳定高质量文案生成器1.LangGPT介绍现有Prompt创建方法有如下缺点:缺乏系统性:大多是细碎的规则,技巧,严重依赖个人经验缺乏灵活性:对他人分享的优质prompt进行调整需要直接修改prompt内容缺乏交互友好性:优质promp......
  • Rancher怎么设置把日志发送给elasticsearch
    搭建elascsearch集群不详述配置日志发送打开日志Rancher配置日志发送其实时在node启用了Daemonset使用fluentd进行日志收集#kubectlgetdaemonset-ncattle-loggingNAMEDESIREDCURRENTREADYUP-TO-DATEAVAILABLEN......