我們使用帶有 的編譯時日志記錄源生成LoggerMessageAttribute,例如:
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。
那可能嗎?
謝謝!
uj5u.com熱心網友回復:
您可以使用一個間接層:
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>();
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/465785.html
