如何使用 ASP.NET 核心日志记录延迟登录



>假设这样的场景:

[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如何。这似乎相当浪费。

日志记录 API 中是否有允许更懒惰的方法的地方?我能想到的唯一解决方法是覆盖模型上的ToString以创建非常详细的表示,并跳过使用 JsonConvert.SerializeObject 作为工具。

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/Extensions/blob/master/src/Logging/Logging/src/Logger.cs#L53

相关内容

  • 没有找到相关文章

最新更新