码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • LoggerMessageAttribute 高性能的日志记录


    合集 - .NET Core(5)
    1.多个 .NET Core SDK 版本之间进行切换 global.json03-122.HttpClientHandler VS SocketsHttpHandler03-103..Net Core中使用DiagnosticSource进行日志记录03-124.DiagnosticSource DiagnosticListener 无侵入式分布式跟踪03-14
    5.LoggerMessageAttribute 高性能的日志记录03-15
    收起

    .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


  • 相关阅读:
    JAVA信息技术共享社区计算机毕业设计Mybatis+系统+数据库+调试部署
    labelme标注的json数据集转换成coco数据集
    全国矿产地空间分布数据
    从开店营销到智能化私域运营,有赞发布人工智能引擎Jarvis
    强烈推荐APP破解常用工具集合!
    【SAP-ABAP】--MRKO隐式增强字段步骤
    Linux aarch64交叉编译之libusb库
    跑通一个十年年前的细分着色器示例
    Qt音视频开发03-ffmpeg倍速播放(半倍速/2倍速/4倍速/8倍速)
    什么是深拷贝;深拷贝和浅拷贝有什么区别;深拷贝和浅拷贝有哪些方法(详解)
  • 原文地址:https://www.cnblogs.com/chenyishi/p/18073599
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号