【问题标题】:SeriLog not outputing non-string dataSeriLog 不输出非字符串数据
【发布时间】:2017-11-01 20:14:39
【问题描述】:

我刚刚开始在 Core 2 网络应用中使用 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 示例代码中?

【问题讨论】:

    标签: serilog


    【解决方案1】:

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

    您必须修改outputTemplate 才能看到传递的值,如discussion in SeriLog's issues list

    .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[?] = 'Downloading messages' 可能会检索一组有意义的事件,但 Scope[0] = 42 只是无稽之谈。

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

    【讨论】:

    • 另一个要考虑的选项,而不是{Scope},是在输出模板中包含{Properties}。这将打印Scope,当它存在时,以及引用段落中建议的其他键值属性。干杯! :-)
    猜你喜欢
    • 2019-12-04
    • 2013-10-10
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多