Log4net SMTPAppender是否异步发送电子邮件?

时间:2011-08-24 06:43:58

标签: asp.net log4net

Log4net SMTPAppender是否异步发送电子邮件?如果没有,我如何异步发送日志邮件?

我的log4net.config是:

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <log4net>
    <appender name="SMTPAppender" type="log4net.Appender.SMTPAppender">
      <authentication value="Basic" />
      <to value="xxx@xx.com" />
      <from value="yyy@xx.com" />
      <username value="yyy@xx.com" />
      <password value="yyy" />
      <subject value="xxx" />
      <smtpHost value="smtp.xx.com" />
      <lossy value="true" />
      <evaluator type="log4net.Core.LevelEvaluator">
        <threshold value="WARN" />
      </evaluator>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline%date [%thread] %-5level %logger %newline %message%newline%newline%newline" />
      </layout>
    </appender>
    <root>
      <level value="INFO"></level>
    </root>
    <logger name="MyLogger">
      <level value="INFO"></level>
      <appender-ref ref="SMTPAppender"></appender-ref>
    </logger>
  </log4net>
</configuration>

3 个答案:

答案 0 :(得分:4)

您可以像这样异步调用日志记录方法:

Task.Factory.StartNew(() => log.Info("Message I want to email"));

我实际上从以下SO文章中得到了这个建议:

How do I create an asynchronous wrapper for log4net?

答案 1 :(得分:2)

在发布固态解决方案之前,有一个简单的解决方法。

public class SmtpAsyncAppender : SmtpAppender
{
    protected override void SendEmail(string messageBody)
    {
        Task.Run(() => base.SendEmail(messageBody));
    }
}

它假设SmtpAppender.SendEmail是线程安全的并且可以重新输入。它适用于log4net v1.2.13.0,没有理由不在将来。

答案 2 :(得分:0)

Log4net没有内置异步的appender。如果您需要该功能,则需要编写自己的appender。下载log4net源代码应该可以帮助您入门......