Serilog : 将不同的数据记录到不同的地方
Serilog : log different data to different places
我想将我的全部数据记录在一个文件中,并且只记录我的 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 Github 存储库中没有 Serilog.Sinks.Oracle
项目,所以我假设您使用 Serilog.Sinks.Oracle. The 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();
配置数据库日志记录通常需要比这更多的代码,因此最好将代码提取到不同的方法中。您可能希望使用额外的列来提取常见属性,例如类别、activity 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 并不总是一个好主意。
在这种情况下,几乎总是需要指定额外的列来保存常见属性,例如类别和 activity ID,甚至可能是客户 ID。这意味着指定额外的列。无论数据库产品如何,查询原始 JSON 数据都比查询具体化和索引列更昂贵。
在获得 table 可以实际用于故障排除之前,需要进行一些实验。如果不是单独的文件,数据库日志配置应该被提取到一个单独的方法中。否则 Startup.cs
或在 .NET 6 中 Program.cs
将变得不可读。
我想将我的全部数据记录在一个文件中,并且只记录我的 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 Github 存储库中没有 Serilog.Sinks.Oracle
项目,所以我假设您使用 Serilog.Sinks.Oracle. The 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();
配置数据库日志记录通常需要比这更多的代码,因此最好将代码提取到不同的方法中。您可能希望使用额外的列来提取常见属性,例如类别、activity 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 并不总是一个好主意。
在这种情况下,几乎总是需要指定额外的列来保存常见属性,例如类别和 activity ID,甚至可能是客户 ID。这意味着指定额外的列。无论数据库产品如何,查询原始 JSON 数据都比查询具体化和索引列更昂贵。
在获得 table 可以实际用于故障排除之前,需要进行一些实验。如果不是单独的文件,数据库日志配置应该被提取到一个单独的方法中。否则 Startup.cs
或在 .NET 6 中 Program.cs
将变得不可读。