首页 > 解决方案 > 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 数据库中记录错误数据。我必须如何配置上述代码,将整个数据存储在文件中,将错误数据存储在数据库中?

标签: c#oracleserilog

解决方案


几乎所有的接收器都有一个restrictedToMinimumLevel参数。Serilog.Sinks.OracleSerilog Github 存储库中没有项目,所以我假设您使用Serilog.Sinks.OracleOracle()方法也接受一个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, 将变得一团糟。


推荐阅读