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

How to use Autofac with a Serilog wrapper class

不久前,我们开始将我们的记录器从 log4net 替换为 Serilog,以便将我们的日志直接发送到我们的 Elastic。在我们的项目中,我们使用 Autofac 处理 IOC。因此,我们最初创建了一个包装器 class (LogSerilog) 和一个相应的接口 (ILogSerilog),当在 class LogSerilog 我们配置了 root logger

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,它似乎是 me.because 的最佳解决方案,它将为我们连接所有上下文。问题是它似乎没有 work.Even 更多,log4net 接收器(我们仍在使用 log4net 在机器中获取日志副本)也不能正常工作!我觉得我在这里做错了什么 - 但我不确定我应该如何解决它。

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

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

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

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

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