我们在LoggerMessageAttribute中使用compile-time logging source generation,例如:

public static partial class LoggerExtensions
{
    [LoggerMessage(
        EventId = 1953,
        EventName = "ExecutingQuery",
        Level = LogLevel.Information,
        Message = "Executing query {MyQuery}")]
    public static partial void ExecutingQuery(this ILogger logger, string myQuery);
}

所以我们可以这样记录:

internal class MyBeautifulQueryHandler
{
    private readonly ILogger<MyBeautifulQueryHandler> _logger;

    public MyBeautifulQueryHandler(ILogger<MyBeautifulQueryHandler> logger) => _logger = logger;

    public async Task ExecuteAsync(MyBeautifulQuery query)
    {
        _logger.ExecutingQuery(nameof(MyBeautifulQuery));

        // do something asynchronously
    }
}

这种使用nameof运算符的模式在我们的代码库中反复出现.

我想知道编译时日志(log)源代码生成是否支持以下内容:

_logger.ExecutingQuery<MyBeautifulQuery>();

甚至更好

_logger.ExecutingQuery();

两者都会产生相同的日志(log)消息Executing query MyBeautifulQuery.所以我在寻找类似CallerMemberNameAttribute的东西.

可能吗?

谢谢

推荐答案

您可以使用间接层:

public static partial class LoggerExtensions
{
    [LoggerMessage(
        EventId = 1953,
        EventName = "ExecutingQuery",
        Level = LogLevel.Information,
        Message = "Executing query {MyQuery}")]
    static partial void LogExecutingQuery(ILogger logger, string myQuery);

    public static void ExecutingQuery<T>(this ILogger logger)
    {
          LogExecutingQuery(logger, typeof(T).Name);
    }
}

会有你想要的用途:

_logger.ExecutingQuery<MyBeautifulQuery>();

Csharp相关问答推荐

在依赖性注入和继承之间进行 Select

. NET 8使用COM向VB6公开

try 在Blazor项目中生成html

更新产品但丢失产品ASP.NET Core的形象

将轮询与超时同步

应用程序启动器,可 Select 物理屏幕

如何捕获对ASP.NET核心应用程序的所有请求并将其发送到一个页面

有没有更好的方法来在CosmosDB上插入非id?

Blazor Server.NET 8中的Blazore.FluentValidation问题

Blazor:搜索框在第一次搜索时不搜索

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

如何正确处置所有动态控件?

用于请求用户返回列表的C#Google API

C#命名管道-编码错误?

如何正确地在VB中初始化类?

Autofac -动态实例化:手动传递构造函数

当`JToken?`为空时?

在C#/ASP.NET Core 7中,什么可能导致POST请求作为GET请求发送

Cmd中的&ping.end()";有时会失败,而";ping";总是有效

ASP.NET Core 8 Web API:如何添加版本控制?