如何将Autofac与Serilog包装类一起使用

Gre*_*een 5 c# log4net inversion-of-control autofac serilog

不久之前,我们开始将log4net中的记录器替换为Serilog,以便将我们的日志直接发送到我们的Elastic.在我们的项目中,我们正在IOC使用Autofac.因此,我们最初创建了一个包装器类(LogSerilog)和ILogSerilog我们添加到构建器的相应接口(),当LogSerilog我们在类中配置了 根记录器时.

public class LogSerilog : ILogSerilog
{
    private readonly IElasticConfiguration configuration;
    public LogSerilog(IElasticConfiguration configuration)
    {
        this.configuration = configuration;
        Init();
    }
    public void Init()
    {
        var logger = new LoggerConfiguration().MinimumLevel.Information().Enrich.WithMachineName();
        try
        {
            logger.WriteTo.Elasticsearch(
                this.configuration.GetElasticPath(), typeName: "Serilog");
        }
        catch (Exception)
        {
            //Swallow - Elastic is N/A don't wan't to crash. logging won't help since I don't have logger yet :)
        }
        logger.WriteTo.Log4Net();
        Log.Logger = logger.CreateLogger();
    }
    ..........
Run Code Online (Sandbox Code Playgroud)

之后我看到autofac-serilog-integration Nuget对我来说似乎是最好的解决方案.因为它将为我们连接所有上下文.问题是,它似乎不起作用.甚至更多,log4net接收器(我们仍然使用log4net来获取机器中的日志副本)也不起作用!我觉得我在这里做错了 - 但我不知道该怎么办呢.

  1. 如果我将删除wrrapper类,我应该在哪里配置根记录器?
  2. log4net接收器的问题是否与包装器类无关?
  3. 如果你看到我以错误的方式接近它,任何其他提示都会受到欢迎.

Gre*_*een 0

经过一番调查,我找到了我的问题的答案。

  1. 如果我要删除包装器类,我应该在哪里配置根记录器?
    在主类中——就在程序开始运行的时候\在我需要第一次登录之前。
  2. log4net接收器的问题与包装类无关吗?
    不,它与旧的 log4net dll 版本的引用有关
  3. 如果您发现我以错误的方式处理它,任何其他提示都将受到欢迎。
    拥有 Serilog 包装器并不是真正的问题 - 这不是问题 - 但我确实发现它有问题,因为例如Autofac Serilog integration不支持它并且您需要自己提供上下文。