【问题标题】:C# Serilog conditional logging if one fails?如果一个失败,C# Serilog 条件日志记录?
【发布时间】:2021-05-07 13:55:27
【问题描述】:

我们正处于分析阶段,现在我们有一个架构,Serilog 将写入本地文件,然后有一个 Fluentd 将提取日志并将它们转储到弹性搜索。这种架构的原因是确保没有消息丢失。建议这个架构好不好**???**

但最近我了解到 fluentd 具有将日志存储在本地的内置缓冲区机制,因此我们考虑将日志从应用程序直接推送到 fluentd 而不是本地文件,但是我们担心的是,如果出于某种原因 fluentd关闭,则不会进一步处理日志。所以在这种情况下,如果 fluentd 关闭,我们可以告诉 Serilog 在运行时将消息记录在本地文件中而不是 fluentd 中,我在 serilog 中看到了一些条件代码,但它们不在运行时,请帮忙。

bool enableConsoleLogging = ... bool enableFileLogging = ...

var builder = new LoggerConfiguration()
    .Enrich.WithExceptionDetails()
    .Enrich.FromLogContext()
    .MinimumLevel.Warning()
    .WriteTo.Conditional(evt => enableConsoleLogging, wt => wt.Console())
    .WriteTo.Conditional(evt => enableFileLogging, wt => wt.File(...));

Log.Logger = builder.CreateLogger();

【问题讨论】:

    标签: c# elasticsearch serilog fluentd fluent-bit


    【解决方案1】:

    Serilog 本身没有内置的回退机制,因此由接收器来实现任何类型的持久日志记录/重试机制。

    如果您使用的 Fluentd 接收器没有或没有实现满足您需求的持久日志记录机制,并且您希望完全控制对 Fluentd 的写入,那么您最好使用 writing your own Serilog Sink 发送消息到流利并回退到其他东西。

    你可能想看看Serilog.Sinks.Httpthis example with Fluentd的源代码。

    另外,请记住,写入文件并不能保证 100% 不会丢失消息。写入磁盘失败的原因有很多...包括磁盘空间不足。

    ps:您可能也对此问题的答案感兴趣:“Serilog and seq when no server available

    【讨论】:

    • 感谢您提供有用的信息,我同意写入文件也可能导致消息丢失,但我们会定期清理它们以解决磁盘空间问题,至少它是 99.99% 安全的,所以根据对你来说这个架构好吗?不知道在分布式环境中应该解决哪些挑战,如果您有更好的解决方案,请分享。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 2016-03-04
    • 2011-01-29
    • 2016-04-22
    • 1970-01-01
    相关资源
    最近更新 更多