Как лениво входить в систему с помощью ASP.NET Core?
Предположим, что сценарий такой:
[Route("api/test")]
public class TestController
{
private readonly ILogger<TestController> logger;
public TestController(ILogger<TestController> logger)
{
this.logger = logger;
}
[HttpPut]
public void Put(Guid id, [FromBody]FooModel model)
{
logger.LogInformation($"Putting {id}");
logger.LogTrace("Putting model {0}", Newtonsoft.Json.JsonConvert.SerializeObject(model));
try
{
// Omitted: actual PUT operation.
}
catch (Exception ex)
{
logger.LogError("Exception {0}", ex);
}
}
}
public class FooModel
{
string Bar { get; set; }
}
В этом сценарии LogInformation
вызов вызовет string.Format
звоните, а еще хуже, LogTrace
линия вызовет SerializeObject
звонить, независимо отLogLevel
, Это кажется довольно расточительным.
Есть ли место в Logging API, которое позволяет более ленивый подход? Единственный обходной путь, который я могу придумать, это переопределение ToString
на модели, чтобы создать очень подробное представление, и пропустить использование JsonConvert.SerializeObject
как инструмент.
1 ответ
Решение
ILogger
Интерфейс обеспечивает IsEnabled
метод:
if (logger.IsEnabled(LogLevel.Information))
{
logger.LogInformation($"Putting {id}");
}
if (logger.IsEnabled(LogLevel.Trace))
{
logger.LogTrace("Putting model {0}", Newtonsoft.Json.JsonConvert.SerializeObject(model));
}
Вы найдете реализацию по умолчанию на GitHub: https://github.com/aspnet/Logging/blob/dev/src/Microsoft.Extensions.Logging/Logger.cs#L91