【问题标题】:Serilog : log different data to different placesSerilog:将不同的数据记录到不同的地方
【发布时间】:2021-12-24 14:16:13
【问题描述】:

我想将我的全部数据记录在一个文件中,并且只记录我的 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 数据库中记录错误数据。我必须如何配置上面的代码,将整个数据存储在一个文件中,并将错误数据存储在数据库中?

【问题讨论】:

  • 但它不起作用”不是对问题的技术描述。
  • 我认为我的问题和我的描述已经足够理解了。
  • @Fatman123 不,他们不是。是否有任何内容写入数据库?是否有任何内容写入日志文件?两者写的东西一样吗?至于实际问题,File()Oracle()不是已经有restrictedToMinimumLevel参数了吗?
  • 好的,我同意这一点,给我一点时间来添加更多细节。
  • 这些细节应该包括Oracle()来自哪里,使用了什么包。甲骨文并不那么受欢迎,不管它的销售人员怎么说。 Serilog 本身没有 Oracle 接收器。您使用了哪些软件包?

标签: c# oracle serilog


【解决方案1】:

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

【讨论】:

  • @Fatman123 我也登录到数据库。您可能应该将日志记录配置提取到单独的文件中,因为它会很快变得混乱
  • 你说得对,但第一步我想在不同的地方记录事件。再次感谢您的帮助和时间!!
  • @Fatman123 请注意,除了接受之外,它还习惯于对帖子进行投票,尤其是当它处于这种详细程度和乐于助人的水平时。 (我赞成让 OP 达到标准的模范耐心)。支持 OP,因为它现在满足问题应该证明的跑腿工作的最低要求 - 某人所做的最初的反对是有充分理由的
猜你喜欢
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 2011-08-04
  • 2021-06-13
  • 1970-01-01
相关资源
最近更新 更多