在编译时日志源生成中使用 class 名称

Use class name in compile-time logging source generation

我们正在使用 compile-time logging source generationLoggerMessageAttribute,e。 g.:

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 运算符的模式在我们的代码库中反复出现。

我想知道编译时日志源生成是否支持这样的东西:

_logger.ExecutingQuery<MyBeautifulQuery>();

甚至更好

_logger.ExecutingQuery();

两者都产生相同的日志消息 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>();