You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EF Core创建Logs表供Serilog.Sinks.MsSqlServer使用的疑问

使用EF Core Code First创建Serilog日志表的实践方案

一、自行用EF Core创建Logs表完全合理

不少开发者都采用这种方式,毕竟在Code First模式下,统一通过EF管理所有表结构能让迁移、变更同步更顺畅,也符合项目的数据库管理习惯。

二、具体实现步骤

  1. 定义与Serilog默认结构匹配的Log实体
    要保证实体字段和Serilog.Sinks.MsSqlServer默认的日志表字段对应,否则会导致日志写入失败。示例实体如下:
public class Log
{
    public int Id { get; set; }
    public DateTime Timestamp { get; set; }
    public string Level { get; set; }
    public string Message { get; set; }
    public string MessageTemplate { get; set; }
    public string Exception { get; set; }
    public string Properties { get; set; } // 存储结构化日志的JSON字符串
}
  1. 在DbContext中注册Log实体
public class AppDbContext : DbContext
{
    public DbSet<Log> Logs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 指定表名(和Serilog配置的TableName保持一致)
        modelBuilder.Entity<Log>().ToTable("Logs");
        
        // 配置字段约束与索引优化查询
        modelBuilder.Entity<Log>()
            .Property(l => l.Level)
            .HasMaxLength(128);
        modelBuilder.Entity<Log>()
            .HasIndex(l => l.Timestamp);
    }
}
  1. 配置Serilog禁用自动建表
    在Serilog初始化时设置AutoCreateSqlTable = false,避免Serilog自行创建表结构:
Log.Logger = new LoggerConfiguration()
    .WriteTo.MsSqlServer(
        connectionString: "你的数据库连接字符串",
        sinkOptions: new MsSqlServerSinkOptions
        {
            TableName = "Logs",
            AutoCreateSqlTable = false // 关键配置:禁用自动建表
        })
    .CreateLogger();
  1. 执行EF迁移生成Logs表
    通过CLI或Package Manager Console执行迁移命令:
# CLI命令
dotnet ef migrations add CreateLogsTable
dotnet ef database update

# Package Manager Console命令
Add-Migration CreateLogsTable
Update-Database

三、关于Serilog.Sinks.MsSqlServer的日志查询工具

这个Sink仅负责日志写入,没有自带日志查询工具。所以自行通过EF Core或SQL查询日志是常规且合理的操作——用EF的LINQ查询还能简化过滤、排序逻辑,示例如下:

// 查询近7天的错误日志
var recentErrors = await dbContext.Logs
    .Where(l => l.Level == "Error" && l.Timestamp >= DateTime.Now.AddDays(-7))
    .OrderByDescending(l => l.Timestamp)
    .ToListAsync();

四、注意事项

  • 若要自定义日志字段(如添加SourceContext),需同步在Serilog配置中添加列映射,并更新Log实体:
    .WriteTo.MsSqlServer(
        connectionString: "你的连接字符串",
        sinkOptions: new MsSqlServerSinkOptions { TableName = "Logs", AutoCreateSqlTable = false },
        columnOptions: new ColumnOptions
        {
            AdditionalColumns = new List<SqlColumn>
            {
                new SqlColumn { ColumnName = "SourceContext", DataType = SqlDbType.NVarChar, DataLength = 256 }
            }
        })
    
  • 日志表数据量增长快,建议定期清理归档,或添加更多索引优化查询性能。
  • 若使用Serilog新版本,需注意默认表结构的变动,确保实体字段与官方最新结构一致。

内容的提问来源于stack exchange,提问作者Jonathan Wood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:22:23