可以使 log4net 在外部“可靠”到表面异常吗?

Posted

技术标签:

【中文标题】可以使 log4net 在外部“可靠”到表面异常吗?【英文标题】:Can log4net be made "reliable" externally to surface exceptions? 【发布时间】:2014-08-13 17:19:12 【问题描述】:

我有一个当前使用 log4net 的 C# 应用程序,其中一个新要求要求必须记录用户活动,如果未发生记录,则应用程序必须停止。开箱即用,log4net 是“不可靠的”,不会出现运行时异常。可以在不更改源代码的情况下覆盖它吗?

According to the documentation (and this related question),log4net 不会也不应该出现异常:

没有。 log4net 不可靠。这是一个尽力而为和故障停止的日志记录 系统。

通过故障停止,我们的意思是 log4net 不会抛出意外 运行时的异常可能导致您的应用程序崩溃。 如果出于任何原因,log4net 会抛出未捕获的异常(除了 可能抛出的 ArgumentException 和 ArgumentNullException), 请发送电子邮件至 log4net-user@logging.apache.org 邮件 列表。未捕获的异常作为严重的错误处理,需要 立即关注。

此外,log4net 不会恢复为 System.Console.Out 或 System.Console.Error 当其指定的输出流未打开时, 不可写或变满。这样可以避免破坏其他 由于登录失败,通过淹没用户终端来运行程序。 但是,log4net 将向 System.Console.Error 输出一条消息 和 System.Diagnostics.Trace 指示不能进行日志记录 执行。

是否可以配置或包装 log4net 以保证如果发生异常,它将在运行时出现?

【问题讨论】:

一种选择是下载源代码并进行自定义构建,该构建不会吞下异常而只是抛出它们。有点麻烦,但如果其他选项没有,它会起作用。 -> logging.apache.org/log4net/source-repository.html 注意user activity must be logged 之类的要求。这可能不是logging,而是用户auditing。 IMO,应在应用程序中明确处理审核,因为通常存在不同的一致性要求。 +1 达文,你是对的。目标是审计,而不是记录。 (新手错误)自从发布这个问题以来,我设置了发送 XML 序列化消息以供在 Splunk 上使用,其中包含我要审核的变量:用户名、日期时间等...如果未发送消息,则会引发异常停止用户活动。问题解决了! 【参考方案1】:

不,你不能,log4net 保证会写入日志消息。因此,log4net 无法记录您要求的用户活动记录。当您考虑更改 log4net 源代码以删除它时,请不要开始。异常可以消失的地方有很多,因此制作新的日志系统要可靠得多。只需将日志消息直接写入您想要的位置,并且由于您的要求,您将永远不会使用 log4net 在过滤/不同的附加程序/日志级别/等方面为您提供的功能。

【讨论】:

以上是关于可以使 log4net 在外部“可靠”到表面异常吗?的主要内容,如果未能解决你的问题,请参考以下文章

你能确定哪些进程在外部使用 ncalrpc RPC 端点吗?

我们可以在 log4net %property 中设置字符限制为 10 个字符吗?

Tomcat 服务器无法“在外部”工作

Service Fabric - 如何在外部公开 wcf 服务

如何使用 typescript 在外部 js 文件中调用函数

DSP在工作时候,程序是在内部ram中,还是存储在外部sdram,然后在运行过程中,将程序实时载入其内部运行