如何在不特殊调用ForContext的情况下启用Serilog最低级别替代?

问题描述 投票:0回答:1

This article on Serilog minimum level overrides状态:

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

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

如果那是有道理的,那么我如何在不使用其他参数的情况下自动设置ForContext呢?

serilog
1个回答
3
投票

对于这种所谓的“正常”行为,我不需要手动设置.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<>()调用。

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

如果您使用的是Microsoft的通用主机,则需要对其进行配置,以使用自定义的ServiceProviderFactory,该自定义ServiceProviderFactory将负责创建实例并调用.ForContext<>()。一种简单的方法是[ C0],然后利用我上面提到的integrate Autofac with Microsoft's Generic Host

© www.soinside.com 2019 - 2024. All rights reserved.