Pas*_*als 9 .net c# log4net smtp log4net-configuration
我正在尝试在log4net.config文件中配置smtp appender.问题是我已经浏览了整个互联网,并且无法找到如何在包含所有其他日志信息(如info,debug,error,fatal)发生错误时发送电子邮件.仅在应用程序结束时(不是每次发生ERROR时).
因此,我只希望在以下情况下收到此电子邮件:应用程序结束+包含所有日志信息(DEBUG,INFO,ERROR,FATAL)+仅在出现ERROR时.
详细说明这是因为我在c sharp中处理异常的方式,在整个地方进行多级处理,因此如果发生错误,无论多少次我只想接收一封电子邮件.此外,我不想使用多个日志,而只是使用root中的一个.
谢谢.
SmtpAppender不可能自己完成这个.所以我所做的是为类型的追加器创建另一个appender MemoryAppender.我在此记录器上设置了一个阈值,仅包含应触发的消息SmtpAppender,例如Error.我们使用它来确定是否要发送记录了更多级别的电子邮件.
我们实际上并不关心中的消息 - MemoryAppender我们只关心它最后包含消息.我们通过电子邮件收到的消息实际上来自于SmtpAppender.
在我的程序结束时,我检查内存appender以查看它的GetEvents()是否包含任何事件.如果是这样,我不会阻止它SmtpAppender正常运行.
两个appender的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>
Run Code Online (Sandbox Code Playgroud)
在程序结束时运行该禁用SmtpAppender如果ErrorHolder附加器是空的:
// 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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11634 次 |
| 最近记录: |