Log4Net smtp appender仅在出现完整日志错误时发送电子邮件(调试和信息和错误)。 仅在申请结束时

我正在尝试在log4net.config文件中配置smtp appender。 问题是,我已经浏览了整个互联网,并且无法找到如何在包含所有其他日志信息(例如信息,调试,错误,致命错误)发生错误时发送电子邮件。 仅在应用程序结束时(不是每次发生ERROR时)。

因此,我只希望在以下情况下收到此电子邮件:应用程序结束+包含所有日志信息(DEBUG,INFO,ERROR,FATAL)+仅在出现ERROR时。

再详细说明这是因为我在c sharp中处理exception的方式,在整个地方进行多级处理,因此如果发生错误,无论多少次我只想接收一封电子邮件。 此外,我不想使用多个日志,而只是使用root中的一个。

谢谢。

SmtpAppender无法独立完成此任务。 所以我所做的是为MemoryAppender类型的追加器创建另一个appender。 我在此记录器上设置了一个阈值,仅包含应触发SmtpAppender消息,例如Error 。 我们使用它来确定是否要发送记录了更多级别的电子邮件。

我们实际上并不关心MemoryAppender的消息 – 我们只关心它最后包含消息。 我们通过电子邮件收到的消息实际上来自SmtpAppender

在我的程序结束时,我检查内存appender以查看其GetEvents()是否包含任何事件。 如果是这样,我不会阻止SmtpAppender正常运行。

两个appender的Log4Net配置:

                         

在应用程序结束时,如果ErrorHolder appender为空,则运行此选项以禁用SmtpAppender

 // trigger loggers if errors occurred: var memoryAppender = ((Hierarchy)LogManager.GetRepository()) .Root.Appenders.OfType().FirstOrDefault(); if (memoryAppender != null && memoryAppender.GetEvents().Length == 0) { // there was no error so don't email anything var smtpAppender = ((Hierarchy)LogManager.GetRepository()) .Root.Appenders.OfType().FirstOrDefault(); if (smtpAppender != null) { smtpAppender.Threshold = Level.Off; smtpAppender.ActivateOptions(); } } 

这听起来像应用程序配置问题而不是log4net配置问题。 我建议在应用程序结束时放一个方法,如果它发现里面有错误,就会通过电子邮件发送给你日志文件。 您可以通过在记录错误的每个位置将全局变量从false翻转为true来检测此错误,或者可以等到应用程序结束,然后读取日志文件以查看它是否包含错误。 第一种方法在关机时会更快,但这意味着在多个位置修改代码。 后者允许您只添加一个方法,但在大文件中可能需要更长时间。

第三种选择是使用log4net将错误发送到第二个日志文件(因此它们会转到两个位置)。 然后,当您的应用程序关闭并且您正在检查是否应该通过电子邮件发送日志时,只需检查是否存在仅错误文件。 如果存在,请将其删除(以便下次不存在)并通过电子邮件发送完整日志。

将阈值更改为错误。 此外,log 4net仅在应用程序为clodes时发送电子邮件。您可以提前发送。 但是你首先需要复制它(因为org文件仍在使用中),而且你可以通过电子邮件发送副本。