Search code examples
c#windows-servicesserilog

Serilog writes duplicate entries in it's output


I have written a Windows Service which logs its operations using Serilog

The application also uses Autofac for dependency Injection support and Seq for structured logging.

 using Autofac;
 public class ContainerInitiator
 {
       public static IContainer BuildContainer()
       {
          var _builder = new ContainerBuilder();
          var logger = LoggerUtility.CreateLogger();
          _builder.RegisterInstance(logger).As<ILogger>().SingleInstance();
          var container = _builder.Build();
          ContainerFactory.SetContainer(container);
          return container;
        }
  }

Here is Log utility class

public class LoggerUtility
{
    private static string connectionString = ConfigurationManager.AppSettings["applicationName"];
    public static ILogger CreateLogger()
    {
        return GetLoggerConfiguration().CreateLogger();
    }
    private static LoggerConfiguration GetLoggerConfiguration()
    {
        var config = new LoggerConfiguration()
            .ReadFrom.AppSettings();
        config = config.
           Enrich.WithProperty("ApplicationName", connectionString).
           Enrich.WithExceptionDetails().
           Enrich.WithMachineName().
           Enrich.WithProcessId().
           Enrich.WithThreadId().
           ReadFrom.AppSettings();
        return config;
    }
}

Here is my service class, which is logging the activities

public class Engine : IEngine
{
      private readonly ILogger _logger;

      public RedistributeEngine(IContainerFactory containerFactory)
      {
           _logger = containerFactory.GetInstance<ILogger>();
      }

       public void Start()
       {
             _logger.Information("Engine started!");
       }
}

As you see below Seq logs, it has two entries on the same time!

enter image description here


Solution

  • You're reading the configuration from App.Settings twice:

    private static LoggerConfiguration GetLoggerConfiguration()
    {
        var config = new LoggerConfiguration()
            .ReadFrom.AppSettings(); // <<<<<<<<<<<< *#*#*#*#*#*#*#*#
        config = config.
           Enrich.WithProperty("ApplicationName", connectionString).
           Enrich.WithExceptionDetails().
           Enrich.WithMachineName().
           Enrich.WithProcessId().
           Enrich.WithThreadId().
           ReadFrom.AppSettings(); // <<<<<<<<<<<< *#*#*#*#*#*#*#*#
        return config;
    }