【问题标题】:How to enable Serilog minimum level overrides without particular convention of calling ForContext?如何在没有调用 ForContext 的特定约定的情况下启用 Serilog 最低级别覆盖?
【发布时间】:2020-04-23 15:46:00
【问题描述】:

This article on Serilog minimum level overrides 状态:

Override 的第一个参数是源上下文前缀,通常与与记录器关联的类的命名空间限定类型名称匹配。

对于这种所谓的“正常”行为,我不需要为调用我的记录器的每个类手动设置 .ForContext<>() 不同吗?换句话说,如果没有关于如何设置 .ForContext 的特定约定,特定于命名空间的最低日志级别应该如何工作?

如果这是有道理的,那么我怎样才能自动设置 ForContext 而无需在任何地方使用不同的参数调用它?

【问题讨论】:

    标签: serilog


    【解决方案1】:

    对于这种所谓的“正常”行为,我是不是需要手动设置 .ForContext() 对于我的记录器被调用的每个类都不同 来自?

    是的,你会的。一种常见的方法是在每个类上使用Log.ForContext<T>(),在一个成员变量中,该变量在类的不同方法之间共享(以便所有日志都使用相同的上下文写入)。例如

    public class SomeService
    {
        private readonly ILogger _log = Log.ForContext<SomeService>();
        // ...
    }
    
    public class SomeRepository
    {
        private readonly ILogger _log = Log.ForContext<SomeRepository>();
        // ...
    }
    

    如果您使用的是 IoC 容器,例如 Autofac,则可以在 IoC 容器解析类时自动调用 .ForContext&lt;&gt;()(例如,通过使用构造函数注入)。

    如果您专门使用Autofac,则可以使用AutofacSerilogIntegration 来解决这个问题。其他 IoC 容器可能有类似的实现(或者您必须自己实现)。

    如果您使用的是 Microsoft 的通用主机,那么您需要将其配置为使用自定义的 ServiceProviderFactory,该ServiceProviderFactory 将负责创建实例并调用 .ForContext&lt;&gt;()... 一个简单的方法是integrate Autofac with Microsoft's Generic Host 然后利用我上面提到的AutofacSerilogIntegration

    【讨论】:

    • 如果使用默认的微软注入?我不知道该怎么做,我不知道如何知道services.AddTransient中每个消费者的类型。
    • 我正在使用 Microsoft.AspNetCore.WebHost,它似乎不支持 UseServiceProviderFactory。还有其他想法吗?
    • @PatrickSzalapski link I referenced above on Autofac's documentation 提供了有关如何与 ASP .NET Cere 集成的示例
    • 好的,我迁移到使用通用主机。我仍然想找到一种没有 Autofac 的方法,但不确定我自己的 ServiceProviderFactory 会是什么样子。网上所有的例子都和Autofac有关。
    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 2013-05-18
    • 2014-07-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多