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 将变得不可读。