c# - Log4Net smtp appender 仅在出现完整日志(调试和信息和错误)错误时发送电子邮件。仅当应用程序结束时

标签 c# .net smtp log4net log4net-configuration

我正在尝试在我拥有的 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/

相关文章:

c# - 如何使用 C# XML 序列化序列化 xml 数组和类属性

c# - StackExchange.Redis 在 for 循环上进行管道传输?

c# - 带有 TLS 的假 smtp 服务器

python - 使用 python 发送电子邮件时出现问题?

c# - 使用 C# 发送电子邮件 - 不起作用,但没有抛出错误

c# - RegEx.Replace 替换整个单词并在部分单词时跳过

c# - socket 推荐

c# - 根据编译器标志/目标框架安装 nuget 包

.net - 使用 .NET 的 XmlSerializer 时忽略派生类的属性

C# - 抛出异常但调用方方法已经完成的任务会发生什么情况?