使用Serilog.Sinks.Oracle时如何指定存储日志的表和列
Serilog.Sinks.Oracle 指定自定义表与列映射配置方法
你可以通过WithSettings指定目标表、WithColumnMapping配置列对应关系来适配你提前创建好的日志表,调整后的配置示例如下:
var connectionString = "user id=system;password=oracle;data source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL = TCP)(HOST = localhost)(PORT = 49161)))(CONNECT_DATA=(SERVICE_NAME = xe)))"; var logger = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.Oracle(cfg => cfg.WithSettings(connectionString, tableName: "你创建的日志表名") // 按你实际的表结构逐个配置列映射 .WithColumnMapping("LOG_TIMESTAMP", OracleDbType.TimeStamp, ev => ev.Timestamp) .WithColumnMapping("LOG_LEVEL", OracleDbType.Varchar2, 16, ev => ev.Level.ToString()) .WithColumnMapping("CONTENT", OracleDbType.Varchar2, 4000, ev => ev.RenderMessage()) .WithColumnMapping("EXCEPTION_INFO", OracleDbType.Clob, ev => ev.Exception?.ToString()) .WithColumnMapping("EXT_PROPERTIES", OracleDbType.Clob, ev => ev.Properties.ToString()) .UseBurstBatch() .CreateSink()) .CreateLogger();
配置说明
- 指定目标表:
WithSettings方法传入第二个字符串参数tableName即可绑定你提前建好的日志表,若表存在于指定表空间,还可以追加tableSpace: "你的表空间名"参数。 - 自定义列映射:通过
WithColumnMapping方法逐列配置映射规则,入参顺序为:- 数据库中实际的列名
- 该列对应的Oracle数据类型
- (可选)可变长度类型的长度限制
- 列值生成规则,从Serilog日志事件对象
ev中提取对应内容
- 若你的表存在自增主键、触发器生成字段等不需要插入的列,无需在映射中配置即可自动忽略。
内容的提问来源于stack exchange,提问作者Fatman123
相关产品推荐
相关产品推荐

