当我在 .NET 5 中运行应用程序时,Serilog 不会创建日志 SQL 表

KB_*_*yan 8 c# serilog asp.net-core

我有 appsettings.json 设置来自动创建日志表"autoCreateSqlTable": true

但是,我检查了 SQL,但找不到该表。我似乎无法找到导致它无法创建和记录信息的原因。

程序.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();
            });
}
Run Code Online (Sandbox Code Playgroud)

应用程序设置.json:

"Serilog": {
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "****",
          "tableName": "Log",
          "autoCreateSqlTable": true
        }
      }
    ]
  },
Run Code Online (Sandbox Code Playgroud)

Chi*_*y T 7

我的项目基于.Net5.0 Core MVC,项目安装了以下 nuget 包。

    <PackageReference Include="Serilog" Version="2.10.0" />
    <PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
    <PackageReference Include="Serilog.Sinks.MSSqlServer" Version="5.6.0" />
Run Code Online (Sandbox Code Playgroud)

下面的 config 和 program.cs 文件对我有用。

确保 appsettings.json 中的 Serilog 包含此行 "Using":["Serilog.Sinks.MSSqlServer"] ,如下所示:

"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"
      }
    ]
  }
Run Code Online (Sandbox Code Playgroud)

我的 Program.cs 文件

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>();
                });
    }
Run Code Online (Sandbox Code Playgroud)

Serilog默认创建表,更多详情请点击这里

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) 
);
Run Code Online (Sandbox Code Playgroud)