Search code examples
c#asp.net-coreserilog

Serilog is not creating log SQL table when I run the application in .NET 5


I have the appsettings.json setup to create the log table automatically with "autoCreateSqlTable": true

However, I checked SQL but the table is nowhere to be found. I can't seem to find what is causing it to not create and log the information.

Program.cs :

public class Program
{
    public static void Main(string[] args)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .Build();

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .CreateLogger();

        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>().UseSerilog();
            });
}

appsettings.json:

"Serilog": {
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "****",
          "tableName": "Log",
          "autoCreateSqlTable": true
        }
      }
    ]
  },

Solution

  • My Project is based on .Net5.0 Core MVC and project has below nuget packages installed.

        <PackageReference Include="Serilog" Version="2.10.0" />
        <PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
        <PackageReference Include="Serilog.Sinks.MSSqlServer" Version="5.6.0" />
    

    Below config and program.cs file works for me.

    Make sure your Serilog in appsettings.json has this line "Using":["Serilog.Sinks.MSSqlServer"] as shown below:

    "Serilog": {
        "Using": [ "Serilog.Sinks.MSSqlServer" ],
        "MinimumLevel": "Information",
        "Override": {
          "Microsoft.EntityFrameworkCore.Database.Command": "Error",
          "Microsoft": "Error",
          "Microsoft.AspNetCore.Mvc": "Warnning"
        },
        "WriteTo": [         
          {
            "Name": "MSSqlServer",
            "Args": {
              "connectionString": "Server=dbserverhost.domain.com;Database=DBName; Trusted_Connection=True; MultipleActiveResultSets=true",
              "schemaName": "dbo",
              "tableName": "AppLogs",
              "autoCreateSqlTable": true
              //,
              //"columnOptionsSection": {
              //  "removeStandardColumns": [ "Properties" ]
              //  //,
              //  //"customColumns": [
              //  //  {
              //  //    "ColumnName": "EventType",
              //  //    "DataType": "int",
              //  //    "AllowNull": false
              //  //  },
              //  //  {
              //  //    "ColumnName": "Release",
              //  //    "DataType": "varchar",
              //  //    "DataLength": 32
              //  //  }
              //  //]
              //}
            }
            ,
            "restrictedToMinimumLevel":  "Warning"
          }
        ]
      }
    

    My Program.cs file

    using Serilog;
    public class Program
        {
            public static void Main(string[] args)
            {
    
    
                var config = new ConfigurationBuilder()
                    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                    .Build();
    
    
                Log.Logger = new LoggerConfiguration()
                    .ReadFrom.Configuration(config)
                    //.WriteTo.File("Logs/log-.txt", rollingInterval: RollingInterval.Day)
                    .CreateLogger();
                
                Log.Information("Hello {Name} from thread {ThreadId}", Environment.GetEnvironmentVariable("USERNAME"), Thread.CurrentThread.ManagedThreadId);
    
                
    
                var host = CreateHostBuilder(args).Build();
    
                using (var scope = host.Services.CreateScope())
                {
                    var services = scope.ServiceProvider;
                    var loggerFactory = services.GetRequiredService<ILoggerFactory>();
                }
    
                host.Run();
    
                // CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .UseSerilog()
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    });
        }
    

    Serilog Default Create Table, For more details click here

    CREATE TABLE [Logs] (
    
       [Id] int IDENTITY(1,1) NOT NULL,
       [Message] nvarchar(max) NULL,
       [MessageTemplate] nvarchar(max) NULL,
       [Level] nvarchar(128) NULL,
       [TimeStamp] datetime NOT NULL,
       [Exception] nvarchar(max) NULL,
       [Properties] nvarchar(max) NULL
    
       CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED ([Id] ASC) 
    );