Exception 异常记录子系统的吞吐量是否应该受到限制?如果是,如何进行?

Exception 异常记录子系统的吞吐量是否应该受到限制?如果是,如何进行?,exception,architecture,logging,log4j,log4net,Exception,Architecture,Logging,Log4j,Log4net,我们遇到过这样一个例子,异常在某种无限循环中消失了。 堆栈跟踪非常大,我们记录了所有这些跟踪 这会淹没我们的Oracle数据库,当重做日志达到其大小限制时,db停止 编辑:当然,最重要的是找到无限循环的原因并纠正系统中的错误。我们已经做到了,这不是问题所在。 该系统可能会有更多类似的bug(它是一个windows服务,并且一直在运行),在这种情况下,一个应用程序破坏了整个数据库,这意味着Oracle数据库上的所有应用程序 我最感兴趣的是你的建筑经验。来自其他日志框架,如log4net、log4j

我们遇到过这样一个例子,异常在某种无限循环中消失了。 堆栈跟踪非常大,我们记录了所有这些跟踪

这会淹没我们的Oracle数据库,当重做日志达到其大小限制时,db停止

编辑:当然,最重要的是找到无限循环的原因并纠正系统中的错误。我们已经做到了,这不是问题所在。 该系统可能会有更多类似的bug(它是一个windows服务,并且一直在运行),在这种情况下,一个应用程序破坏了整个数据库,这意味着Oracle数据库上的所有应用程序


我最感兴趣的是你的建筑经验。来自其他日志框架,如log4net、log4j等。他们如何处理大量异常?就像处理所有其他异常一样处理它们?

我更担心无限循环的根本原因,而不是限制日志记录

我会检查您的代码中是否有捕获异常、记录堆栈跟踪并重新抛出的方法。我认为捕获和重新抛出并不是异常处理。如果一个类真的不能处理这个异常,最好让它冒泡,直到它到达一个可以处理它的点


重做日志?你多久冲洗一次?当然,您没有一个大事务,是吗?

我更担心无限循环的根本原因,而不是限制日志记录

我会检查您的代码中是否有捕获异常、记录堆栈跟踪并重新抛出的方法。我认为捕获和重新抛出并不是异常处理。如果一个类真的不能处理这个异常,最好让它冒泡,直到它到达一个可以处理它的点


重做日志?你多久冲洗一次?当然你没有一个大的事务,是吗?

我认为你的情况说明,一定要有某种机制来防止异常日志在任何地方造成拒绝服务,就像这样

如果您使用Windows事件日志,这可以自动为您处理,因为日志已满时,旧记录可以自动清除。您也可以编写一个基于DB的系统来做同样的事情

当然,您也希望尽一切可能在第一时间消除此类错误


另一种选择可能是同时检测并忽略多个连续错误。。。也许只是更新一个
计数
属性/字段。

我认为您的情况说明,应该有某种机制来防止异常日志在任何地方造成拒绝服务,就像这样

如果您使用Windows事件日志,这可以自动为您处理,因为日志已满时,旧记录可以自动清除。您也可以编写一个基于DB的系统来做同样的事情

当然,您也希望尽一切可能在第一时间消除此类错误


另一种选择可能是同时检测并忽略多个连续错误。。。也许只是更新一个
计数
属性/字段。

您可以在不使用重做日志的情况下将日志记录到其他数据库吗?这将保护生产数据库

在我们的应用程序中,我们有一个中央异常处理程序,所有异常都会在其中进行处理

  void OnExceptionOccurs(Exception ex, 
         string enduserFriendlyContextDescription, 
         string tecnicalContextDescription, 
         ILogger loggerBelongingToProcess)

该处理程序可以决定如何记录,并且在调试时您有一个断点的中心位置

您可以在没有重做日志的情况下将日志记录到其他数据库吗?这将保护生产数据库

在我们的应用程序中,我们有一个中央异常处理程序,所有异常都会在其中进行处理

  void OnExceptionOccurs(Exception ex, 
         string enduserFriendlyContextDescription, 
         string tecnicalContextDescription, 
         ILogger loggerBelongingToProcess)

该处理程序可以决定如何记录,并且在调试时,您有一个断点的中心位置

+1,以强调“处理”可能是如何无意中导致此问题的。不,我们没有一个大型事务。在本例中,这是一个开发数据库,AFAIK每天都会刷新重做日志(它是自动的)。+1强调“处理”可能是无意中造成的。不,我们没有一个大事务。在本例中,这是一个开发数据库,AFAIK的重做日志每天都会刷新(这是自动的)。我不希望清除异常,因为这样我可以删除数据,帮助我找到代码中问题的根本原因。如果您需要所有的异常,然后你需要所有的异常,你的问题看起来很愚蠢。所以你唯一的选择是不写所有的异常?我不想删除异常,因为这样我可以删除数据,帮助我找到代码中问题的根本原因。如果你需要所有的异常,然后你需要所有的异常,你的问题看起来很傻。所以你唯一的选择是不写所有的异常?好主意,但不,我们不能有单独的数据库用于记录。好主意,但不,我们不能有单独的数据库用于记录。