Search code examples
console-application.net-core-3.1serilog-sinks-file

WriteTo.File not working in .net core 3.1 console application


I have a console application in .net core 3.1 and i configured serilog for logging to file purpose. The WriteTo.Console working but WriteTo.File not working (without any error).

I installed this version for Serilog (NuGet):

Serilog: 2.11.0

Serilog.Extensions.Hosting: 4.2.0

Serilog.Settings.Configuration: 3.3.0

Serilog.Sinks.Async: 1.5.0

Serilog.Sinks.Console: 4.0.1

Serilog.Sinks.File: 4.1.0

Below code is the Serilog config:

Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(builder.Build())
                .MinimumLevel.Information()
                .MinimumLevel.Override("Microsoft", LogEventLevel.Error)
                .MinimumLevel.Override("System", LogEventLevel.Error)
                .Enrich.FromLogContext()
                .WriteTo.Console()
                .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
                .CreateLogger();
Log.Logger.Information("Application Starting");

Here is the Main mathod of the console app:

   static void Main(string[] args)
        {
            var host = AppStartup();

            Log.Warning("test log");

            Console.ReadKey();
        }

        static void BuildConfig(IConfigurationBuilder builder)
        {
            builder.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
        }

        static IHost AppStartup()
        {
            var builder = new ConfigurationBuilder();
            BuildConfig(builder);

            Log.Logger = new LoggerConfiguration()
                    .ReadFrom.Configuration(builder.Build())
                    .MinimumLevel.Information()
                    .MinimumLevel.Override("Microsoft", LogEventLevel.Error)
                    .MinimumLevel.Override("System", LogEventLevel.Error)
                    .Enrich.FromLogContext()
                    .WriteTo.Console()
                    .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
                    .CreateLogger();

            Log.Logger.Information("Application Starting");

            var host = Host.CreateDefaultBuilder() // Initialising the Host 
                        .ConfigureServices((context, services) => { // Adding the DI container for configuration

                })
                        .UseSerilog() // Add Serilog
                        .Build(); // Build the Host

            return host;
        }
}

And the appsetting.json data:

    {
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "MinimalLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Information",
        "System": "Warning"
      }
    }

  },
  "ConnectionStrings": {
    "DefaultConnection": "DataSource=app.db;Cache=Shared"
  }
}

Solution

  • Solved! Just use explicit full path! @DavidG thank you for your help.

     Log.Logger = new LoggerConfiguration()
                        .ReadFrom.Configuration(builder.Build())
                        .MinimumLevel.Information()
                        .MinimumLevel.Override("Microsoft", LogEventLevel.Error)
                        .MinimumLevel.Override("System", LogEventLevel.Error)
                        .Enrich.FromLogContext()
                        .WriteTo.Console()
                        .WriteTo.File("C:\\Logs\\log.txt", rollingInterval: RollingInterval.Day)
                        .CreateLogger();