代码之家  ›  专栏  ›  技术社区  ›  Sailing Judo

Serilog能否返回结果操作的值而不是数据类型?

  •  1
  • Sailing Judo  · 技术社区  · 6 年前

    我使用Serilog.AspNetCore包在.NETCore2.1WebAPI中安装了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]]'.
    

    有没有办法覆盖这个默认行为?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Kirk Larkin    6 年前

    为了 Serilog公司 ,它可以返回json数据类型,但不能更改的内置返回值 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 记录类型而不是值。我想这是为了更好的表现。您可以假设,如果将响应序列化为string,将浪费大量性能,这是没有必要的。

    [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" };
        }
    }