如何使用 ASP.NET 核心日志记录进行惰性记录?
How to log lazily with ASP.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; }
}
在这种情况下,LogInformation
调用会触发 string.Format
调用,更糟糕的是,LogTrace
行会触发 a 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));
}
您将在 GitHub 上找到默认实现:https://github.com/aspnet/Extensions/blob/master/src/Logging/Logging/src/Logger.cs#L53
假设这样一个场景:
[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
行会触发 a 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));
}
您将在 GitHub 上找到默认实现:https://github.com/aspnet/Extensions/blob/master/src/Logging/Logging/src/Logger.cs#L53