c# - Serilog:将不同的数据记录到不同的地方
问题描述
我想将我的全部数据记录在一个文件中,并且只记录我的 oracle 数据库中的错误。我正在使用下面的代码,但它不起作用。
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose().WriteTo.File("logs/myLog.txt", rollingInterval: RollingInterval.Minute)
.MinimumLevel.Error().WriteTo.Oracle(cfg =>
cfg.WithSettings(logConnectionString, tableSpaceAndTableName: "MY_TABLE")
.UseBurstBatch(true, 1000, true, 1)
.CreateSink())
.CreateLogger();
在这种情况下,我只在文件和 oracle 数据库中记录错误数据。我必须如何配置上述代码,将整个数据存储在文件中,将错误数据存储在数据库中?
解决方案
几乎所有的接收器都有一个restrictedToMinimumLevel
参数。Serilog.Sinks.Oracle
Serilog Github 存储库中没有项目,所以我假设您使用Serilog.Sinks.Oracle。Oracle()方法也接受一个restrictedToMinimumLevel
参数。
您可以将代码更改为:
Log.Logger = new LoggerConfiguration()
.WriteTo.File("logs/myLog.txt",
rollingInterval: RollingInterval.Minute,
restrictedToMinimumLevel:LogEventLevel.Verbose)
.WriteTo.Oracle(cfg =>
cfg.WithSettings(logConnectionString, tableSpaceAndTableName: "MY_TABLE")
.UseBurstBatch(true, 1000, true, 1)
.CreateSink(),
restrictedToMinimumLevel:LogEventLevel.Error )
.CreateLogger();
配置数据库日志记录通常需要比这更多的代码,因此最好将代码提取到不同的方法。您可能希望使用其他列来提取常见属性,例如类别、活动 ID 等,这样您就不必解析 JSON 有效负载来查找特定事件:
ILogEventSink ConfigureOracle(BatchLoggerConfiguration cfg)
{
const string column = "ADDITIONALDATACOLUMN";
var columnOptions = new ColumnOptions
{
AdditionalDataColumns = new List<DataColumn>
{
new DataColumn(column , typeof(string))
}
};
return cfg.WithSettings(logConnectionString, tableSpaceAndTableName: "MY_TABLE")
.UseBurstBatch(true, 1000, true, 1)
.CreateSink();
}
...
Log.Logger = new LoggerConfiguration()
.WriteTo.File("logs/myLog.txt",
rollingInterval: RollingInterval.Minute,
restrictedToMinimumLevel:LogEventLevel.Verbose)
.WriteTo.Oracle(ConfigureOracle,LogEventLevel.Error )
.CreateLogger();
组织数据库日志记录代码
我也登录到数据库。将所有内容放在一个表达式中可能很时髦,但生成的代码很快就会变得难以阅读和维护。流畅的 API 并不总是一个好主意。
在这种情况下,几乎总是需要指定额外的列来保存常见属性,如类别和活动 ID,甚至可能是客户 ID。这意味着指定额外的列。无论是哪种数据库产品,查询原始 JSON 数据都比查询具体化列和索引列更昂贵。
在获得一张可以实际用于故障排除的表格之前,需要进行一些实验。如果不是单独的文件,则应将数据库日志记录配置提取到单独的单独方法中。否则Startup.cs
,在 .NET 6 中,Program.cs
, 将变得一团糟。
推荐阅读
- mapping - 合同修改映射数据时web3js发送交易失败,但重新混合工作
- micronaut - Can you alter a Micronaut App features from the command line?
- c - 在导致分段错误的字符串文字上使用 strtol
- apache-spark - 如何在 Spark 数据帧上训练神经网络自动编码器(Keras)
- java - 应用主题在预览中显示,但在手机上不显示
- java - ZXing Android Embedded GS-1 支持
- python - 出现错误:无法读取 python selenium 中未定义的属性“单击”
- php - 在会话中编辑值
- php - Composer Yii2 Bower:要发布的文件或目录不存在:C:\myProject\vendor\bower/jquery/dist
- sql - 即使当天/周/月没有数据也返回结果