【问题标题】:Serilog and seq when no server available没有可用服务器时的 Serilog 和 seq
【发布时间】:2021-01-08 08:03:07
【问题描述】:

当使用 Serilog 和 Seq 的应用程序找不到将日志发送到的服务器时,预期的行为是什么?每次尝试记录都会引发异常吗?

如果 Seq 服务器可用,我希望我的应用使用它,但如果它不可用,我仍然继续运行并记录到文件。

【问题讨论】:

    标签: c# serilog seq


    【解决方案1】:

    当使用 Serilog 和 Seq 的应用程序找不到将日志发送到的服务器时,预期的行为是什么?

    这取决于您使用的是常规接收器(通过.WriteTo)还是审计接收器(通过.AuditTo)。

    写入常规接收器是一种安全操作,绝不会抛出异常,that's by design。因此,如果您启用它,发送这些消息时发生的任何异常只会出现在SelfLog 中。

    例如

    // Write Serilog errors to the Console
    Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
    

    当然,上面的示例只是为了说明SelfLog 功能...您可以选择是否/在哪里/如何显示或存储这些错误消息。

    写入审计接收器时,您会看到每条失败消息的错误。

    每次尝试记录都会引发异常吗?

    这取决于接收器。对于Serilog.Sinks.Seq,它是periodic batching sink,因此它将尝试以X 日志事件的批次发送消息(X 是可配置的)所以如果 Seq 服务器不可用,您希望查看每批发送失败的错误。

    如果 Seq 服务器可用,我希望我的应用程序使用它,但如果它不可用,我仍然继续运行并记录到文件。

    Seq 接收器具有内存缓冲和重试支持,可以处理短时间的服务器或网络不可用,这对于大多数应用程序来说通常已经足够了。

    或者,Seq sink has durable log shipping 已烘焙,您可以在磁盘上指定一个文件,它将缓冲消息存储在磁盘上的文件中,这样即使您的应用重新启动,它也可以重试。

    Log.Logger = new LoggerConfiguration()
        .WriteTo.Seq("https://my-seq-server:5341",
            bufferBaseFilename: @"C:\MyApp\Logs\myapp") // <<<<<<
        .CreateLogger();
    

    最后,另一种选择是使用Seq Forwarder,您可以将其与您的应用程序(即同一服务器)并排安装,然后将日志直接写入它,它会负责将它们保存到自己的内部本地存储并在可用时将它们转发到远程 Seq 服务器。

    【讨论】:

    • 像往常一样精彩详细而全面的答案!
    • 很棒的答案,我非常感谢您的努力。谢谢!
    【解决方案2】:

    Serilog 有一个强有力的保证永远不会抛出到日志线程(exceptions from forwarding like you cite are emitted via SelfLog

    这并不常见和/或没有自然的方式说“Seq but fall back to file”开箱即用 - 批处理接收器保存内容并最终丢弃内容以避免内存不足。

    https://github.com/serilog/serilog-sinks-async 的自述文件可能值得一读,如果您正在考虑您真正想要的关于文件和/或服务器的语义。 (也许如果您在带有健康检查的托管环境中,您可能会认为无法转发日志是健康状况不佳的指标 - 在这种情况下,明显的问题是任何替换实例都可能不会更好)。另外这个Best practices Guide 可能会帮助你思考你真正想要什么。

    很遗憾,您最好将问题拆分成单独的问题,以便在此处实际回答。

    【讨论】:

    • 感谢您的回答!这并不是说我希望我的 Seq 回退到文件中。我希望它始终记录到文件,如果有人在没有访问 Seq 服务器的情况下运行该应用程序,我不希望该应用程序仍然工作。这可能吗,还是转发机制最终会耗尽内存并无论如何都会失败?
    • 啊,在这种情况下,您可以 a) 配置两个接收器 b) 如果无法访问,Seq 接收器将丢弃东西。或者,您可以有一个命令行开关并提供 seq 端点(或者让存在/不存在 env var 做同样的工作)。这涵盖了不同时对 seq 端点进行硬编码的需要。 In general I'd make the call to .WriteTo.Seq conditional on an endpoint being supplied
    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多