可以使 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 个字符吗?
Service Fabric - 如何在外部公开 wcf 服务