首页 > 解决方案 > 如何将 Autofac 与 Serilog 包装类一起使用

问题描述

不久前,我们开始将我们的记录器从 log4net 替换为 Serilog,以便将我们的日志直接发送到我们的Elastic. 在我们的项目中,我们正在IOC使用Autofac. 因此,我们最初创建了一个包装 类 LogSerilogILogSerilogLogSerilog

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();
    }
    ..........

在那之后,我看到了autofac-serilog-integration Nuget,这对我来说似乎是最好的解决方案。因为它会为我们连接所有上下文。问题是它似乎不起作用。甚至,log4net sink(我们仍然使用log4net在机器中拥有日志的副本)也无法正常工作!我觉得我在这里做错了什么 - 但我不确定我应该如何解决它。

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

标签: c#inversion-of-controllog4netautofacserilog

解决方案


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

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

推荐阅读