我正在尝试在我拥有的 log4net.config 文件中配置一个 smtp appender。问题是我在整个互联网上都看过,但找不到在发生错误时发送电子邮件的方法,其中包含所有其他日志信息,例如信息、调试、错误、致命。仅当应用程序结束时(不是每次发生错误时)。
所以我只想在以下情况下收到此电子邮件: 申请结束+ 包含所有日志信息(DEBUG、INFO、ERROR、FATAL)+ 仅当发生错误时。
详细说明这是因为我在 c sharp 中处理异常的方式,在整个地方进行多级处理,所以如果发生错误,无论多少次我只想收到一封电子邮件。我也不想使用多个日志,而是 根中只有一个。
谢谢。
最佳答案
SmtpAppender
无法自行完成此操作。所以我所做的是创建另一个 appender,它是 MemoryAppender
类型的 appender。我在此记录器上设置了一个阈值,以仅包含应触发 SmtpAppender
的消息,例如错误
。我们使用它来确定我们是否要发送记录了更多级别的电子邮件。
我们实际上并不关心 MemoryAppender
中的消息——我们只关心它在末尾包含消息。我们通过电子邮件收到的消息实际上来自 SmtpAppender
。
在我的程序结束时,我检查内存附加器以查看它的 GetEvents() 是否包含任何事件。如果是这样,我不会阻止 SmtpAppender
正常运行。
两个附加程序的 Log4Net 配置:
<appender name="ErrorHolder" type="log4net.Appender.MemoryAppender" >
<onlyFixPartialEventData value="true" />
<!-- if *any* message is logged with this level, the email appender will
be used with its own level -->
<threshold value="ERROR" />
</appender>
<appender name="Email" type="log4net.Appender.SmtpAppender">
<!-- the level you want to see in the email IF ErrorHolder finds anything -->
<threshold value="INFO"/>
<bufferSize value="512" />
<lossy value="false" /> <!-- important! -->
<to value="name@domain.com" />
<from value="name@domain.com" />
<subject value="ERROR: subject" />
<smtpHost value="smtpserver" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ErrorHolder" />
<appender-ref ref="Email" />
</root>
如果 ErrorHolder
appender 为空,则在应用程序结束时运行此命令以禁用 SmtpAppender
:
// trigger loggers if errors occurred:
var memoryAppender = ((Hierarchy)LogManager.GetRepository())
.Root.Appenders.OfType<MemoryAppender>().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<SmtpAppender>().FirstOrDefault();
if (smtpAppender != null)
{
smtpAppender.Threshold = Level.Off;
smtpAppender.ActivateOptions();
}
}
关于c# - Log4Net smtp appender 仅在出现完整日志(调试和信息和错误)错误时发送电子邮件。仅当应用程序结束时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5894900/