【问题标题】:Multiple smtphost addresses using smtpAppender in log4net在 log4net 中使用 smtpAppender 的多个 smtphost 地址
【发布时间】:2012-06-11 14:56:09
【问题描述】:

我希望能够指定多个 smtp 服务器主机地址并实现一个逻辑,即如果使用一个 smtp 服务器的电子邮件失败,它会尝试使用下一个 smtp 服务器地址发送。是否可以使用 log4net.我们可以覆盖 log4net 的一些功能,并在其中实现我们自己的逻辑来发送电子邮件吗?

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
  <to value="group@ivp.in" />
  <from value="uname@ivp.in" />
  <subject>Error Notification</subject>
  **<smtpHost value="10.0.0.12, 10.0.0.13" />**
  <authentication value="None" />
  <port value="25" />
  <bufferSize value="1" />
  <EnableSsl value="false"/>
  <lossy value="true" />
  <evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="ERROR"/>
  </evaluator>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%newline%date [%thread] %level %logger - %message%newline%newline%exception" />
  </layout>
</appender>

【问题讨论】:

  • 您可以覆盖 SmtpAppender 类并使用条件语句(if/else)决定smtpHost 的值。查看我的answer 了解更多详情

标签: c# .net vb.net logging log4net


【解决方案1】:

有一个更简单的方法

<to value="group@ivp.in,group2@ivp.in,group3@ivp.in,group4@ivp.in" />

【讨论】:

  • 问题是I want to be able to specify multiple smtp server host addresses,而不是多个to 地址
  • 好的。但我的回答是我的回答对一些用户有用:)
  • 这可能不是 op 问题的答案,但它是我到达这里时正在寻找的答案。 18 票对 4 票表明这里的大多数人都在同一条船上
  • 这里也一样.. 这不是操作问题的答案,而是我需要的答案。
  • 这是我需要的:)
【解决方案2】:

只有实现custom SmtpAppender才有可能。

我已经从Log4net sourcecode Examples. 复制了CustomSmtpAppender 代码,希望对您有所帮助。

不要忘记在您的应用配置中引用CustomSmtpAppender

using System;
using System.IO;
using System.Web.Mail;

using log4net.Layout;
using log4net.Core;
using log4net.Appender;

namespace SampleAppendersApp.Appender
{
    /// <summary>
    /// Simple mail appender that sends individual messages
    /// </summary>
    /// <remarks>
    /// This SimpleSmtpAppender sends each LoggingEvent received as a
    /// separate mail message.
    /// The mail subject line can be specified using a pattern layout.
    /// </remarks>
    public class SimpleSmtpAppender : AppenderSkeleton
    {
        public SimpleSmtpAppender()
        {   
        }

        public string To 
        {
            get { return m_to; }
            set { m_to = value; }
        }

        public string From 
        {
            get { return m_from; }
            set { m_from = value; }
        }

        public PatternLayout Subject 
        {
            get { return m_subjectLayout; }
            set { m_subjectLayout = value; }
        }

        public string SmtpHost
        {
            get { return m_smtpHost; }
            set { m_smtpHost = value; }
        }

        #region Override implementation of AppenderSkeleton

        override protected void Append(LoggingEvent loggingEvent) 
        {
            try 
            {     
                StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);

                string t = Layout.Header;
                if (t != null)
                {
                    writer.Write(t);
                }

                // Render the event and append the text to the buffer
                RenderLoggingEvent(writer, loggingEvent);

                t = Layout.Footer;
                if (t != null)
                {
                    writer.Write(t);
                }

                MailMessage mailMessage = new MailMessage();
                mailMessage.Body = writer.ToString();
                mailMessage.From = m_from;
                mailMessage.To = m_to;

                if (m_subjectLayout == null)
                {
                    mailMessage.Subject = "Missing Subject Layout";
                }
                else
                {
                    StringWriter subjectWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
                    m_subjectLayout.Format(subjectWriter, loggingEvent);
                    mailMessage.Subject = subjectWriter.ToString();
                }

                if (m_smtpHost != null && m_smtpHost.Length > 0)
                {
                    SmtpMail.SmtpServer = m_smtpHost;
                }

                SmtpMail.Send(mailMessage);
            } 
            catch(Exception e) 
            {
                ErrorHandler.Error("Error occurred while sending e-mail notification.", e);
            }       
        }

        override protected bool RequiresLayout
        {
            get { return true; }
        }

        #endregion // Override implementation of AppenderSkeleton

        private string m_to;
        private string m_from;
        private PatternLayout m_subjectLayout;
        private string m_smtpHost;
    }
}

【讨论】:

  • 完美!正是我想要的。现在我可以按照我想要的方式实现我自己的 smtp 处理程序。谢谢
【解决方案3】:

我知道我迟到了,但我遇到了一个类似的问题,需要我以编程方式解决它,而不是直接将它们硬编码到 app.config 文件中。

当您不想通过配置文件公开您的电子邮件凭据时,这是您想要使用的方法。如果您出于任何原因想要覆盖 SmtpAppender,它也很有用。

这是app.config 的 log4net 附加程序设置:

<appender name="SmtpAppender" type="MyNameSpace.SmtpAppenderHelper">
    <to value="sendto@company.com" />
    <cc value="sendccto@company.com" />
    <subject value="An Error Occured" />
    <bufferSize value="1" />
    <EnableSsl value="true" />
    <lossy value="true" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%level %date - %message%newline" />
    </layout>
    <evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="ERROR" />
    </evaluator>
</appender>

我的助手类:

namespace MyNameSpace
{
    public class SmtpAppenderHelper : SmtpAppender
    {
        protected override void SendBuffer(LoggingEvent[] events)
        {
            // overriding the SmtpAppender so that I can add some sensitive information
            this.Username = "myemailaddress@gmail.com";
            this.Password = "NotSafePassword";
            this.SmtpHost = "smtp.gmail.com";
            this.Port = 587;
            this.Authentication = SmtpAuthentication.Basic;
            this.From = "myemailaddress@gmail.com";

            base.SendBuffer(events);
        }
    }
}

您还可以创建SmtpAppenderHelper 类的方法来帮助您修改电子邮件主题并在base.SendBuffer(events) 方法之前触发它来修改主题,如下所示:

protected virtual void prepareSubject(ICollection<LoggingEvent> events)
{
    Subject = null;
    foreach (LoggingEvent _event in events)
    {
        if (Evaluator.IsTriggeringEvent(_event))
        {
            string msg = _event.ExceptionObject == null ? _event.RenderedMessage : _event.ExceptionObject.Message;

            Subject = string.Format("[{0}] {1}", _event.Level, msg);

            break;
        }
    }
    
}

另一个example here on overriding the Appenders

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多