Serilog.Sinks.SQLite如何创建自定义列 可否配置MSSQL Sink写入SQLite
Serilog.Sinks.SQLite 自定义列配置及替代方案解答
一、为SQLite日志表添加自定义列的实现方法
Serilog.Sinks.SQLite 原生支持自定义列,不需要修改源码,按以下步骤配置即可:
- 初始化日志配置时不要使用默认列规则,手动实例化
SQLiteColumnOptions对象,通过AdditionalColumns字段声明你需要的自定义列,指定每列的名称、数据类型、是否允许为空等属性,将AddDefaultColumns设为true即可保留默认的日志基础列(日志ID、时间戳、级别、消息、异常、属性集合等)。 - 声明完列结构后,通过
ColumnWriters字典为每个自定义列绑定值提取逻辑,直接从日志事件的Properties集合中读取你通过Enricher注入的属性值即可,注意Serilog存储的属性值默认包裹了双引号,提取后需要手动去除。 - 如果你的SQLite日志文件已经生成,手动给已存在的Logs表添加对应自定义列即可;如果是新库,程序启动时会自动按你配置的结构建表,不需要手动写SQL建表。
配置示例:
// 定义列配置 var columnOptions = new SQLiteColumnOptions { AddDefaultColumns = true, AdditionalColumns = new List<SQLiteColumn> { new SQLiteColumn { ColumnName = "ProcessName", DataType = SQLiteType.Text, AllowNull = true }, new SQLiteColumn { ColumnName = "EnvironmentName", DataType = SQLiteType.Text, AllowNull = true } } }; // 绑定自定义列的值提取规则 columnOptions.ColumnWriters.Add("ProcessName", logEvent => { logEvent.Properties.TryGetValue("ProcessName", out var procValue); return procValue?.ToString().Trim('"'); }); columnOptions.ColumnWriters.Add("EnvironmentName", logEvent => { logEvent.Properties.TryGetValue("EnvironmentName", out var envValue); return envValue?.ToString().Trim('"'); }); // 初始化Logger Log.Logger = new LoggerConfiguration() .Enrich.WithProcessName() .Enrich.WithEnvironmentName() .WriteTo.SQLite( sqliteDbPath: "./log.db", tableName: "Logs", columnOptions: columnOptions ) .CreateLogger();
二、MSSQL Sink写入SQLite的可行性说明
无法通过配置MSSQL Sink实现写入SQLite文件,原因如下:
- Serilog.Sinks.MSSqlServer 底层完全适配Microsoft SQL Server的通信协议、SQL语法、数据类型规则,和SQLite的文件存储逻辑、SQL方言、类型系统存在本质差异,没有提供切换目标数据库类型的配置入口,强行连接SQLite文件会出现语法不兼容、类型映射错误等问题。
- 如果需要文档更完善的SQLite写入方案,直接使用上述自定义列配置即可,该逻辑是官方包原生支持的,不需要依赖第三方二次封装,稳定性有保障。
内容的提问来源于stack exchange,提问作者CoffeeOrc
相关产品推荐
相关产品推荐

