Serilog 可以 return 结果操作的值而不是数据类型吗?
Can Serilog return the value of resulting action rather than the data type?
我在 .net core 2.1 web API 中使用 Serilog.AspNetCore 包安装了 Serilog。当一个动作被调用时,传入的参数被记录下来:
[INF] Executing action method WebApi.Controllers.ValuesController.Get (WebApi) with arguments (["4"]) - Validation state: "Valid"
但是当操作完成后,我得到以下不太有用的行:
[INF] Executed action method WebApi.Controllers.ValuesController.Get (WebApi), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 8.2537ms.
[INF] Executing ObjectResult, writing value of type 'System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]'.
我更喜欢实际值。例如,字典应该只是 json.
有没有办法覆盖此默认行为?
对于 Serilog,它可以 return json 数据类型,但是,您不能更改内置的 return 值Executing ObjectResult
。这是由 ObjectResultExecuting 控制的,这是硬编码。
public static void ObjectResultExecuting(this ILogger logger, object value)
{
if (logger.IsEnabled(LogLevel.Information))
{
var type = value == null ? "null" : value.GetType().FullName;
_objectResultExecuting(logger, type, null);
}
}
ObjectResultExecuting
记录类型而不是值。我认为这是为了更好的性能。你可以假设如果你序列化对字符串的响应,它会浪费很多性能,而且没有必要这样做。
如果您更喜欢登录特定的响应,您可以尝试自己登录该方法。
[Produces("application/json")]
[Route("api/[controller]")]
public class SerilogController : Controller
{
private readonly ILogger<SerilogController> _log;
public SerilogController(ILogger<SerilogController> log)
{
_log = log;
}
[HttpGet]
public IEnumerable<string> Get(string password)
{
_log.LogInformation(JsonConvert.SerializeObject(new string[] { "value1", "value2" }));
return new string[] { "value1", "value2" };
}
}
我在 .net core 2.1 web API 中使用 Serilog.AspNetCore 包安装了 Serilog。当一个动作被调用时,传入的参数被记录下来:
[INF] Executing action method WebApi.Controllers.ValuesController.Get (WebApi) with arguments (["4"]) - Validation state: "Valid"
但是当操作完成后,我得到以下不太有用的行:
[INF] Executed action method WebApi.Controllers.ValuesController.Get (WebApi), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 8.2537ms.
[INF] Executing ObjectResult, writing value of type 'System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]'.
我更喜欢实际值。例如,字典应该只是 json.
有没有办法覆盖此默认行为?
对于 Serilog,它可以 return json 数据类型,但是,您不能更改内置的 return 值Executing ObjectResult
。这是由 ObjectResultExecuting 控制的,这是硬编码。
public static void ObjectResultExecuting(this ILogger logger, object value)
{
if (logger.IsEnabled(LogLevel.Information))
{
var type = value == null ? "null" : value.GetType().FullName;
_objectResultExecuting(logger, type, null);
}
}
ObjectResultExecuting
记录类型而不是值。我认为这是为了更好的性能。你可以假设如果你序列化对字符串的响应,它会浪费很多性能,而且没有必要这样做。
如果您更喜欢登录特定的响应,您可以尝试自己登录该方法。
[Produces("application/json")]
[Route("api/[controller]")]
public class SerilogController : Controller
{
private readonly ILogger<SerilogController> _log;
public SerilogController(ILogger<SerilogController> log)
{
_log = log;
}
[HttpGet]
public IEnumerable<string> Get(string password)
{
_log.LogInformation(JsonConvert.SerializeObject(new string[] { "value1", "value2" }));
return new string[] { "value1", "value2" };
}
}