c# - Serilog 的 ILogger 使用 Log.ForContext<T> 注入(inject),其中 T 是消费者

标签 c# simple-injector serilog

Serilog 允许创建上下文感知记录器:

Log.ForContext<T>()

我想以 T 的方式向 SimpleInjector 注册 Serilog是消费者的类型,即它被注入(inject)到哪个类。

例如

public class Car
{
    public Car(ILogger logger) <= would be injected using Log.ForContext<Car>()
    {             
    }
}

我可以看到这个has been done with AutoFac .

并查看 SimpleInjector documentation , 有一个非常有前途的重载 RegisterConditional() (使用 Func<TypeFactoryContext, Type> 参数)。

c.RegisterConditional(typeof (ILogger),
    x => Log.ForContext(x.Consumer.ImplementationType), <= won't compile as expecting a Type
    Lifestyle.Scoped,
    x => true);

但是,我不想告诉 SimpleInjector 要构建哪个类型,而是如何构建一个。

最佳答案

我已经将 Serilog 与 Simple Injector 集成在一起,并使用以下代码基于 StackOverflow 上的@Steven genius 回答:logger wrapper best practice

public interface ILogger
{
    void Log(LogEntry entry);
}

public class SerilogLogger<T> : ILogger
{
    private readonly Serilog.ILogger _logger;

    public SerilogLogger()
    {
        _logger = new LoggerConfiguration()
            .WriteTo
            .Trace(LogEventLevel.Information)
            .CreateLogger()
            .ForContext(typeof (T));
    }

    public void Log(LogEntry entry)
    {
        /* Logging abstraction handling */
    }
}

public static class ContainerExtensions {

    public static void RegisterLogging(this Container container)
    {
        container.RegisterConditional(
            typeof(ILogger),
            c => typeof(SerilogLogger<>).MakeGenericType(c.Consumer.ImplementationType),
            Lifestyle.Singleton,
            c => true);
    }

}

在您的 Composition Root 中:

var container = new Container();
container.RegisterLogging();

关于c# - Serilog 的 ILogger 使用 Log.ForContext<T> 注入(inject),其中 T 是消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37620823/

相关文章:

c# - 使用多个构造函数注册开放泛型的简单注入(inject)器

Serilog - 在 AppSettings 中配置多个接收器

serilog - 是否可以将 Serilog 配置为截断(即清空)每个新进程的日志文件?

c# - 将 SQL Server Serilog 接收器包装在 Async 中是否有意义?

c# - 如何针对 future 可能发生变化的数据库表设计数据访问层?

c# - 对生成不同字符串的类进行单元测试

c# - 在消息处理程序中创建 DbContext

c# - 我如何使用简单的注入(inject)器将一个类型及其接口(interface)注册为单例?

c# - 如何清理 TreeView 中具有相同 Text 属性的 "TreeNode"s?

javascript - 如何在 CKEditor 中键入时显示警告消息?在 ASP.NET Web 应用程序中使用 javascript/c#