SeriLog不输出非字符串数据

时间:2017-11-01 20:14:39

标签: serilog

我刚刚开始使用Core 2 Web应用程序中的SeriLog并将示例代码粘贴到我的控制器中:

    _logger.LogInformation("Before");

    using (_logger.BeginScope("Some name"))
    using (_logger.BeginScope(42))
    using (_logger.BeginScope("Formatted {WithValue}", 12345))
    using (_logger.BeginScope(new Dictionary<string, object> { ["ViaDictionary"] = 100 }))
    {
        _logger.LogInformation("Hello from the Index!");
        _logger.LogDebug("Hello is done");
    }

    _logger.LogInformation("After");

但输出排除了非平面文本的行:

2017-11-01 14:53:19.587 -05:00 [Information] Before
2017-11-01 14:53:19.588 -05:00 [Information] Hello from the Index!
2017-11-01 14:53:19.588 -05:00 [Debug] Hello is done
2017-11-01 14:53:19.588 -05:00 [Information] After

一方面,这种方式有意义,但另一方面 - 为什么要将它包含在repos示例代码中?

1 个答案:

答案 0 :(得分:2)

BeginScope将元数据添加到与包含的消息关联的Scope对象。

根据discussion in SeriLog's issues list,您必须修改outputTemplate以查看传递的值:

.WriteTo.LiterateConsole(outputTemplate:
    "{Timestamp:o} [{Level:u3}] {Scope} {Message}{NewLine}{Exception}")

另请注意how Scope is affected by the values passed to BeginScope

上的评论
  

仅仅因为你几乎可以将任何东西传递给BeginScope()并不意味着你必须这样做。对于提供者而言,捕获最有用的信息非常重要,因此本文,但作为诊断辅助,我强烈倾向于明智地使用Dictionary范围值,而不是分层范围名称。

     

结构化键/值属性是自我记录的,并且查询起来更简单。像OrderId = 54这样的日志过滤器很容易制定。 Scope数组不对层次结构中的每个级别附加任何含义:Scope [?] =&#39;正在下载消息&#39;可能会检索一组有意义的事件,但Scope [0] = 42只是无意义。

     

当然,灵活性是存在的,因此您应该以对您最有意义的方式使用API​​: - )。