【问题标题】:Should I buffer in error logging?我应该缓冲错误记录吗?
【发布时间】:2011-08-29 13:34:39
【问题描述】:

我正在使用 log4net 和自定义的 AdoNetAppender 将错误消息记录到数据库中。

将缓冲区大小设置为 10、20 甚至 100 用于日志记录真的是个好主意吗?

我知道这对性能有好处,因为这样不是每个错误都会触发数据库查询,当同时发生许多错误时,这甚至可能会杀死我的服务器,但是

如果我必须等到再发生 99 个错误,直到我可以访问数据库中的错误信息,这使得立即进行错误分析有点困难。

我错过了什么吗?关于缓冲错误消息的方法是什么?

【问题讨论】:

  • 每 X 秒刷新一次缓冲区。这样您就不必等待数据库中的信息太久了。

标签: c# .net logging log4net buffer


【解决方案1】:

可能差异是哲学上的,有些人会说只偶尔使用大量数据进行批量插入。

我们实际上是立即写入日志文件,以便能够立即进行调试,而不必等到再出现 99 个错误。

您最终可以采用混合方法,立即记录(文本)文件并每 100 条记录记录一次数据库...

【讨论】:

    【解决方案2】:

    将缓冲区大小设置为 10、20 甚至 100 用于日志记录真的是个好主意吗?

    不,我认为这不是一个好主意。

    您想知道是否发生错误,不是吗?如果您的应用程序因缓冲区中的 99 条错误消息而崩溃,会发生什么?很难知道究竟是什么导致了问题......

    如果您有这么多错误消息,恕我直言,性能是您的问题中最少的。在一个运行良好的应用程序中,应该很少有错误,如果有的话。大多数日志消息应该是较低级别的(INFO / DEBUG / 等),可以在性能很重要的实时环境中使用适当的级别阈值进行过滤。

    【讨论】:

    • C# 是托管环境;您所描述的那种会破坏您的日志的崩溃非常罕见。程序更有可能抛出异常。您可以使用顶级异常处理程序来刷新日志。
    【解决方案3】:

    也许使用在 MSMQ 上写入的附加程序和将这些消息出列并在 DB 上写入的单独任务允许您确保记录所有消息而不会降低性能。不幸的是,MSMQ 附加程序不是开箱即用的,但很容易编写。 无论如何,由于您正在记录错误,您真的确定直接一一记录会降低性能吗?通常应用程序不会经常失败,以至于在错误报告期间花费更多时间不会影响整体性能。尽量避免过早优化,并在编写更复杂的东西之前进行测试。

    【讨论】:

      【解决方案4】:

      与大多数事情一样,这是一种权衡:保证捕获每个记录的错误与性能。

      只有您知道您的业务需求。您应该在您的环境中进行基准测试以确定可接受的缓冲水平。

      正如另一位发帖人所提到的,最好采用混合方法。

      【讨论】:

        【解决方案5】:

        如果错误率通常很高,那么等待再记录 99 个错误对您来说并不是真正的问题,除非进程崩溃。您将及时发现所有错误。

        但是,如果错误率很低,以至于您要等待很长时间才能出现 10 个错误,那么批处理的意义何在?在最终将数据转储到数据库之前坐几分钟是没有意义的。数据库肯定可以每隔几秒处理一次插入。而且可能还不止于此。

        【讨论】:

        • 好吧,我当然总是假设(希望)错误率很低。但是,如果有人发现如何在我的 WebApp 中触发可记录的错误并且我的缓冲区为 1。他不能轻松地将其用于 DDOS 攻击吗?
        【解决方案6】:

        Log4net 提供他们所谓的lossy logging。基本上,您将附加程序设置为缓冲例如 100 条消息(所有级别),并告诉附加程序在记录错误后立即刷新缓冲区。在这种模式下,当缓冲区已满时,appender 将丢弃日志消息,但根据您的要求,这可能是完全可以接受的(通常对我来说)。最大的优势是您可以获得缓冲和详细日志记录,而不会产生太多开销。

        还可以指示附加程序进行缓冲而不丢弃消息。在这种情况下,如果发生错误或缓冲区已满,它将刷新缓冲区。到目前为止,这对我来说不是一个有用的配置。

        【讨论】:

        • 我只记录错误,所以这对我没有任何影响。 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 2010-11-19
        • 2011-03-28
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多