【问题标题】:Code-First EF Core with Serilog to SQLite使用 Serilog 到 SQLite 的 Code-First EF Core
【发布时间】:2022-03-24 15:35:57
【问题描述】:

应用相关架构可以描述为:

  • 通过使用抽象(例如 Microsoft.Extensions.Logging)将日志与应用程序隔离;
  • 使用 Code-First 方法创建数据库;
  • 应用程序可能会在从 DatabaseFacade 调用 EnsureCreated 之前记录一些信息以记录。

结果:

  • 配置 Serilog 是应用程序启动时 IHost 创建过程的一部分;
  • Serilog 首次运行时会在 EF Core 前面创建一个数据库;
  • EF Core 不会创建数据库,因为它是由 Serilog 创建的;

问题:

  • 是否可以指示 EF Core 更新数据库架构而不为整个数据库创建迁移步骤?
  • 是否可以延迟/禁止 Serilog 创建数据库(例如,只允许更新现有数据库)?
  • 是否还有其他选择可以达到类似的效果?

【问题讨论】:

    标签: ef-code-first asp.net-core-2.0 serilog


    【解决方案1】:

    配置serilog

    IDictionary<string, ColumnWriterBase> columnOptions = new Dictionary<string, ColumnWriterBase>
    {
       { "message",             new RenderedMessageColumnWriter(NpgsqlDbType.Text) },
       { "message_template",    new MessageTemplateColumnWriter(NpgsqlDbType.Text) },
       { "level",               new LevelColumnWriter(true, NpgsqlDbType.Varchar) },
       { "raise_date",          new TimestampColumnWriter(NpgsqlDbType.TimestampTz) },
       { "exception",           new ExceptionColumnWriter(NpgsqlDbType.Text) },
       { "properties",          new LogEventSerializedColumnWriter(NpgsqlDbType.Jsonb) },
       { "props_test",          new PropertiesColumnWriter(NpgsqlDbType.Jsonb) },
       { "machine_name",        new SinglePropertyColumnWriter("MachineName",                       PropertyWriteMethod.ToString, NpgsqlDbType.Text, "l") },
    };
    
    Log.Logger = new LoggerConfiguration()
        .Enrich.FromLogContext()
        .Destructure.UsingAttributes()
        .MinimumLevel.Debug()
        .WriteTo.PostgreSQL(
            connectionString: connectionStringHere,
            tableName: "Logs",
            columnOptions: columnOptions,
            needAutoCreateTable: false,
            schemaName: "public",
            useCopy: true,
            queueLimit: 3000,
            batchSizeLimit: 40,
            period: new TimeSpan(0, 0, 10),
            formatProvider: null)
        .CreateLogger();
    

    然后您可以创建映射这些数据库字段的 C# 类

    [Keyless]
    [Table("Logs")]
    public class ActivityLogs
    {
        [Column("message")]
        public string Message { get; set; }
    
        [Column("message_template")]
        public string MessageTemplate { get; set; }
    
        [Column("level")]
        public string Level { get; set; }
    
        [Column("raise_date")]
        public DateTime RaiseDate { get; set; }
    
        [Column("exception")]
        public string Exception { get; set; }
    
        [Column("properties", TypeName = "jsonb")]
        public string Properties { get; set; }
    
        [Column("props_test", TypeName = "jsonb")]
        public string PropsTest { get; set; }
    }
    

    如果您想添加更多列,那么您还需要修改您的 C# 模型类和 columnOptions。


    PS:这里我试图解释如何使用 Code-First 方法为 serilog 创建数据库。如果您有任何其他问题,请告诉我

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 2020-12-03
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      相关资源
      最近更新 更多