在编译时日志源生成中使用 class 名称
Use class name in compile-time logging source generation
我们正在使用 compile-time logging source generation 和 LoggerMessageAttribute
,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>();
我们正在使用 compile-time logging source generation 和 LoggerMessageAttribute
,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>();