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

问题描述 投票:0回答:6

我有 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();
            });
}

appsettings.json:

"Serilog": {
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "****",
          "tableName": "Log",
          "autoCreateSqlTable": true
        }
      }
    ]
  },
c# asp.net-core serilog
6个回答
5
投票

我的项目基于 .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" />

下面的配置和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"
      }
    ]
  }

我的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>();
                });
    }

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) 
);

3
投票

在 SQL Server 中创建表需要某些权限,您的用户可能没有这些权限,并且接收器可能由于权限错误而无法创建表。

还有其他原因可能会阻止接收器连接到数据库,例如连接字符串上的拼写错误,或不正确的用户/密码等。

用于日志记录的 Serilog 接收器默认情况下是安全的,并且不会抛出异常,因此如果您想解决发生的问题,您应该查看 Serilog 的 SelfLog

例如

Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));

这将打印控制台中接收器的任何错误(如果您没有控制台应用程序,请更改为其他内容)


0
投票

请确认您已创建

database
schema
。就我而言,使用
Serilog.sinks.postgresql
时,不会自动创建数据库和模式。


0
投票

使用https://gist.github.com/mivano/10429656中的脚本或设置

AutoCreateSqlTable=True

.WriteTo.MSSqlServer(
            connectionString: connectionString,
            sinkOptions: new Serilog.Sinks.MSSqlServer.MSSqlServerSinkOptions() { 
                TableName = "Logs", 
                SchemaName="dbo", 
                AutoCreateSqlTable=true 
            }
)

0
投票

我认为自动创建表有一点问题,因为 SqlServerSinkOptions 中有两个不同的属性:AutoCreateSqlDatabase 和 AutoCreateSqlTable。 对我来说,它仅在两者都设置为 true 时才创建表:

        Log.Logger = new LoggerConfiguration()
        .WriteTo.MSSqlServer(
            connectionString: builder.Configuration.GetConnectionString("LogsDbConnection"),
            sinkOptions: new MSSqlServerSinkOptions
            {
                AutoCreateSqlDatabase = true,
                AutoCreateSqlTable = true,
                TableName = "Logs",
            }
        )
        .CreateLogger();

0
投票

我已经通过遵循this简短而有用的教程成功添加了 Serilog SQL SERVER 日志记录。希望对其他人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.