代码之家  ›  专栏  ›  技术社区  ›  Green Moshe

如何在Serilog包装类中使用Autofac

  •  5
  • Green Moshe  · 技术社区  · 8 年前

    不久前,我们开始替换log4net到Serilog的记录器,以便将日志直接发送到 Elastic . 在我们的项目中 IOC 使用 Autofac . 因此,我们最初创建了一个包装类( LogSerilog )以及相应的接口( ILogSerilog )在课堂上,我们把它添加到我们的生成器中 日志系列 我们配置了 根日志 .

    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 这对我来说是最好的解决方案。因为它会为我们连接所有的上下文。问题是它似乎不起作用,甚至log4net接收器(我们仍在使用log4net在机器中复制日志)也不起作用!我觉得我在这里做错了什么,但我不知道该怎么解决。

    1. 如果我要删除wrrapper类,我应该在哪里配置根日志?
    2. log4net接收器的问题与包装类无关吗?
    3. 如果你看到我以错误的方式接近它,任何其他的提示都会受到欢迎。
    2 回复  |  直到 8 年前
        1
  •  0
  •   Scott Mitchell    8 年前

    Serilog有一个方便的静态类,用于设置和保留日志配置。 这是我的环境中常见配置的一个示例:

    string SerilogPrefix = "SerilogPrefix";
    
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.AppSettings(settingPrefix: SerilogPrefix) 
        .Enrich.FromLogContext()
        .Enrich.WithMemoryUsage()
        .Enrich.WithProcessId()
        .Enrich.WithThreadId()
        .Enrich.WithExceptionDetails()
        .Enrich.With(new LogEnricher())        // optional custom class to add properties to the log message
        .Filter.With(new SerilogEventFilter()) // optional custom class to filter messages
        .CreateLogger();
    

    在nuget上查看这些包:

    Serilog.Settings.AppSettings
    Serilog.Enrichers.Memory
    Serilog.Enrichers.Process
    Serilog.Enrichers.Thread
    Serilog.Sinks.Seq
    SerilogMetrics
    
        2
  •  0
  •   C. Augusto Proiete    7 年前

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

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