Jer*_*oen 4 c# .net-core .net-core-logging
假设这样的场景:
[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; }
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,LogInformation呼叫将触发一个string.Format电话,甚至更糟的是,该LogTrace行会触发一个SerializeObject电话,不管LogLevel.这似乎相当浪费.
Logging 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));
}
Run Code Online (Sandbox Code Playgroud)
你会在GitHub上找到默认的实现:https://github.com/aspnet/Extensions/blob/master/src/Logging/Logging/src/Logger.cs#L53
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |