Как лениво входить в систему с помощью 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

Другие вопросы по тегам