【问题标题】:How do I pass a dependency to a Serilog Enricher?如何将依赖项传递给 Serilog Enricher?
【发布时间】:2016-10-03 18:53:44
【问题描述】:

我在我的应用程序中使用 Serilog 进行日志记录。当我配置记录器时,我有这样的代码:

var log = new LoggerConfiguration()
    .Enrich.With<MySerilogEnricher>()
    .ReadAppSettings()
    .CreateLogger();

我想将一些依赖项注入到我的MySerilogEnricher 类中,但是当我尝试时,我得到了这个编译器错误:

错误 CS0310:“SerilogEnricher”必须是非抽象类型,带有 公共无参数构造函数,以便将其用作参数 泛型类型或方法中的“TEnricher” 'LoggerEnrichmentConfiguration.With()'

我明白为什么会收到此错误,但我没有找到简单的解决方法。理想情况下,我可以像这样使用WithInstance 调用:

var instance = new MySerilogEnricher(myDependency);
var log = new LoggerConfiguration()
    .Enrich.WithInstance<MySerilogEnricher>(instance)
    .ReadAppSettings()
    .CreateLogger();

有没有办法将依赖项传递给MySerilogEnricher?我可能有一个包含 MySerilogEnricher 的类,并在属性中将依赖项传递给它,但这看起来很混乱。

【问题讨论】:

    标签: c# dependency-injection serilog


    【解决方案1】:

    您可以使用不带泛型的 .With() 方法来传递丰富器的实例。因此,在您的示例中,它将是:

    var instance = new MySerilogEnricher(myDependency);
    var log = new LoggerConfiguration()
        .Enrich.With(instance)
        .ReadAppSettings()
        .CreateLogger();
    

    【讨论】:

    • 但是,如果我的依赖不是单例,假设它是在容器中注册的具有作用域或瞬态生命周期的服务呢?
    • 在那个具体的例子中,我认为您需要将 Serilog 与您的 DI 容器集成。例如,Serilog 与 Autofac 集成:github.com/nblumhardt/autofac-serilog-integration
    • 这行得通吗? autofac-serilog-integration 的文档表明它允许使用 Serilog 解析上下文 ILogger 实例,但并不表示这会导致 Serilog 尝试从 Autofac 解析其所有依赖项。
    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2013-11-29
    • 2016-05-30
    相关资源
    最近更新 更多