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

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中的一个.

谢谢.

Pas*_*als 6

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)

  • 多数民众赞成正确,你说得对,我确实考虑到了最后检查的想法,那是真的.但是当寻找如何在某些级别出现时看到内部追随者(在这里).我无法找到任何关于任何appender的事情我可以在其中获取事件.所以我唯一能找到的就是MemoryAppender而且我用过它. (3认同)
  • 这里有关于追踪log4net问题的帖子:http://stackoverflow.com/questions/756125/how-to-track-down-log4net-problems (2认同)