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

时间:2018-07-31 15:23:27

标签: c# inversion-of-control log4net autofac serilog

前一段时间,我们开始将记录器从log4net替换为Serilog,以便将日志直接发送到Elastic。在我们的项目中,我们正在使用IOCAutofac一起工作。因此,当我们在类LogSerilog中配置 root时,我们最初创建了一个包装类(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();
    }
    ..........

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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