C# 我应该在错误记录中使用缓冲区吗?

C# 我应该在错误记录中使用缓冲区吗?,c#,.net,logging,log4net,buffer,C#,.net,Logging,Log4net,Buffer,我正在使用log4net和一个定制的AdoNetAppender将错误消息记录到数据库中 对于日志记录,将缓冲区大小设置为10、20甚至100真的是个好主意吗 我知道这对性能有好处,因为这样并不是每一个错误都会触发DB查询,当一次发生许多错误时,这甚至可能会杀死我的服务器,但是 如果我不得不等到99个以上的错误发生,直到我能够访问数据库中的错误信息,那么立即错误分析就有点困难了 我错过什么了吗?缓冲错误消息的方法是什么 可能这是一种哲学上的差异,有些人会说时不时只对大量数据进行批量插入 实际上,

我正在使用log4net和一个定制的AdoNetAppender将错误消息记录到数据库中

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

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

如果我不得不等到99个以上的错误发生,直到我能够访问数据库中的错误信息,那么立即错误分析就有点困难了


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

可能这是一种哲学上的差异,有些人会说时不时只对大量数据进行批量插入

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

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

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

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

你想知道是否发生了错误,是吗?如果应用程序在缓冲区中出现99条错误消息时崩溃,会发生什么情况?很难知道到底是什么导致了这个问题


如果您有这么多错误消息,IMHO性能是您的最小问题。在一个运行良好的应用程序中,即使有错误,也应该很少出错。大多数日志消息应该是较低级别的(INFO/DEBUG/etc),在性能非常重要的实时环境中,可以使用适当的级别阈值将其过滤掉。

与大多数情况一样,这是一种折衷:保证捕获每个记录的错误和性能

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


正如另一张海报所提到的,混合方法是最好的。

也许使用一个在MSMQ上写入的appender和一个单独的任务来对这些消息进行出列并在DB上写入,这样可以确保在不降低性能的情况下记录所有消息。不幸的是,MSMQ追加器不是现成的,但很容易编写。
在任何情况下,由于您正在记录错误,您真的确定直接逐个记录会降低性能吗?通常应用程序不会频繁失败,因此在错误报告期间花费更多时间不会影响总体性能。尽量避免过早优化,并在编写更复杂的内容之前进行测试查看。

如果错误率通常很高,那么等待99个以上的错误被记录下来对您来说并不是什么问题,除非进程崩溃。你会及时发现你所有的错误


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

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


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

每X秒刷新一次缓冲区。那么你就不必在数据库中等待太久的信息了。当然,我总是假设(希望)错误率很低。但是,如果有人发现如何在我的WebApp中触发可记录错误,而我的缓冲区为1,该怎么办。难道他不能轻松地将其用于DDOS攻击吗?我只记录错误,这样对我来说就没有什么区别了。:)C#是一个有管理的环境;你所描述的那种会毁掉你记录的崩溃是极其罕见的。程序更有可能抛出异常。您可以使用顶级异常处理程序刷新日志。