前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET6新东西--Logging Source Generator

.NET6新东西--Logging Source Generator

作者头像
喵叔
发布2022-01-04 10:19:10
3810
发布2022-01-04 10:19:10
举报
文章被收录于专栏:喵叔's 专栏

Logging source generator是.NET6加入的新功能,它以Source Generator为基础来实现的,具有更好的性能以及灵活性,这在注重性能的项目中是一个非常好的功能,但是因为它要用到C# 9中的partial method(分部方法),因此如果要使用它就必须是C#9及以上版本。下面我们来看看如何使用Logging source generator。

简单的例子

一般来说类库里的日志模块会使用静态方法,将日志的各种操作放在一个静态类中,比如下面的代码:

代码语言:javascript
复制
public static void MiaoShuLog(this ILogger logger, string miaoshuLog) => logger.Log(
    LogLevel.Information,
    new EventId(1, "喵叔Log"),
    requestLog);

日志代码这么编写后就可以很方便地进行EventId的管理,避免了EventId重复导致的冲突,但是使用了Logging Source Generator之后代码可以更简单:

代码语言:javascript
复制
[LoggerMessage(LogLevel = LogLevel.Information, EventId=1, EventName= "喵叔Log", Message = "{miaoshuLog}")]
public static void MiaoShuLog(this ILogger logger, string miaoshuLog);
官方示例代码

下面的代码是微软官方提供的一些案列代码:

代码语言:javascript
复制
[LoggerMessage(Level = LogLevel.Information, EventId = 0, Message = "Logging generator sample begin")]
public static partial void TestBegin(this ILogger logger);

[LoggerMessage(Level = LogLevel.Information, EventId = 1, Message = "Logging generator sample end", SkipEnabledCheck = true)]
public static partial void TestEnd(this ILogger logger);

[LoggerMessage(EventId = 2, Message = "Logging generator sample user {userName}")]
public static partial void TestWithArgument(this ILogger logger, LogLevel logLevel, string userName);

// warning SYSLIB1015: Argument 'host' is not referenced from the logging message
[LoggerMessage(EventId = 3)]
public static partial void TestWithEmptyMessage(this ILogger logger, LogLevel logLevel, string host);

[LoggerMessage(
    EventId = 9,
    Level = LogLevel.Trace,
    Message = "Fixed message",
    EventName = "CustomEventName")]
public static partial void LogWithCustomEventName(this ILogger logger);

在上面的代码中静态方法作为扩展方法使用,当然你也可以不作为扩展方法来使用,我们可以根据自己需要和习惯来选择。下面的代码是调用上面定义的Log方法,同样代码也是来自于微软官方:

代码语言:javascript
复制
var loggerFactory = LoggerFactory.Create(builder => builder.AddJsonConsole(options =>
        {
            options.JsonWriterOptions = new JsonWriterOptions()
            {
                Indented = true,
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            };
        }));
var logger = loggerFactory.CreateLogger<LoggingGeneratorSample>();
logger.TestBegin();
logger.TestWithArgument(LogLevel.Warning, Environment.UserName);
logger.TestWithEmptyMessage(LogLevel.Information, Environment.MachineName);
logger.TestEnd();
实例使用示例

除了作为静态方法使用外也可以作为实例方法去使用,实际项目中不关注EventId的日志记录比较多,下面就是这样的一个例子:

代码语言:javascript
复制
new InstanceLoggingGenerator(logger).LoggingTest();
internal partial class InstanceLoggingGenerator
{
    private readonly ILogger _logger;
    public InstanceLoggingGenerator(ILogger logger)
    {
        _logger = logger;
    }
    [LoggerMessage(EventId = 0, EventName = "Test", Level = LogLevel.Information, Message = "Instance logging generator test")]
    public partial void LoggingTest();
}

在上面代码中,实例方法使用可以不传ILogger实例,它会自动从类型中寻找ILogger类型的字段,可以想一下如果类型中有多个ILogger 字段会怎么样?如果没有的话又会怎么样呢?你可以去试试。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单的例子
  • 官方示例代码
  • 实例使用示例
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档