在log4net的使用smtpAppender多smtphost地址 [英] Multiple smtphost addresses using smtpAppender in log4net

查看:328
本文介绍了在log4net的使用smtpAppender多smtphost地址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要一个SMTP服务器出现故障,由此,如果电子邮件使用,以便能够指定多个SMTP服务器的主机地址和执行逻辑,它会尝试使用下一个SMTP服务器地址来发送。使用log4net的是否有可能。我们可以覆盖log4net的一些功能,并实现我们自己的逻辑在里面发送电子邮件?

 <附加目的地名称=SmtpAppenderTYPE =log4net.Appender.SmtpAppender>
  <价值=group@ivp.in/>
  <从价值=uname@ivp.in/>
  <主题>错误通知< /受试者GT;
  **< smtpHost值=10.0.0.12,10.0.0.13/> **
  <验证值=无/>
  <端口值=25/>
  &所述; BUFFERSIZE值=1/>
  < EnableSsl值=FALSE/>
  <损耗值=真/>
  <评估TYPE =log4net.Core.LevelEvaluator>
    <阈值=ERROR/>
  < /评估>
  <布局类型=log4net.Layout.PatternLayout>
    < conversionPattern值=%换行符%日[%线程]%的水平记录仪% - %的消息%换行符%换行符%的异常/>
  < /布局>
< /附加器>
 

解决方案

这只是如果实现是可能的自定义SmtpAppender

我抄 CustomSmtpAppender code从的 log4net的来源$ C ​​$ C例子。的hopefullly这将帮助你。

不要忘了参考 CustomSmtpAppender 在你的应用程序的配置

 使用系统;
使用System.IO;
使用System.Web.Mail和;

使用log4net.Layout;
使用log4net.Core;
使用log4net.Appender;

命名空间SampleAppendersApp.Appender
{
    ///<总结>
    ///简单的邮件附加器发送个人信息
    ///< /总结>
    ///<说明>
    ///这SimpleSmtpAppender发送每个LoggingEvent所收为
    ///独立的邮件。
    ///邮件主题行可以使用模式布局中指定。
    ///< /说明>
    公共类SimpleSmtpAppender:AppenderSkeleton
    {
        公共SimpleSmtpAppender()
        {
        }

        公共字符串要
        {
            {返回m_to; }
            集合{m_to =价值; }
        }

        公共字符串从
        {
            {返回m_from; }
            集合{m_from =价值; }
        }

        公众的PatternLayout主题
        {
            {返回m_subjectLayout; }
            集合{m_subjectLayout =价值; }
        }

        公共字符串SmtpHost
        {
            {返回m_smtpHost; }
            集合{m_smtpHost =价值; }
        }

        #REGION覆盖实施AppenderSkeleton的

        覆盖保护无效追加(LoggingEvent所LoggingEvent所)
        {
            尝试
            {
                StringWriter的作家=新的StringWriter(System.Globalization.CultureInfo.InvariantCulture);

                串T = Layout.Header;
                如果(T!= NULL)
                {
                    writer.Write(T);
                }

                //渲染事件并追加到缓冲区
                RenderLoggingEvent(作家,LoggingEvent所);

                T = Layout.Footer;
                如果(T!= NULL)
                {
                    writer.Write(T);
                }

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

                如果(m_subjectLayout == NULL)
                {
                    mailMessage.Subject =缺少学科布局;
                }
                其他
                {
                    StringWriter的subjectWriter =新的StringWriter(System.Globalization.CultureInfo.InvariantCulture);
                    m_subjectLayout.Format(subjectWriter,LoggingEvent所);
                    mailMessage.Subject = subjectWriter.ToString();
                }

                如果(m_smtpHost =空&安培;!&安培; m_smtpHost.Length大于0)
                {
                    SmtpMail的SmtpServer = m_smtpHost;
                }

                SmtpMail.Send(mailMessage);
            }
            赶上(例外五)
            {
                ErrorHandler.Error(在发送电子邮件通知时发生错误。,E);
            }
        }

        覆盖保护布尔RequiresLayout
        {
            获得{返回true; }
        }

        #endregion //覆盖实施AppenderSkeleton的

        私人字符串m_to;
        私人字符串m_from;
        私人的PatternLayout m_subjectLayout;
        私人字符串m_smtpHost;
    }
}
 

I want to be able to specify multiple smtp server host addresses and implement a logic whereby if email using one smtp server fails, it tries to send using the next smtp server address. Is it possible using log4net. Can we override some functions of log4net and implement our own logic in it to send emails?

<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>

解决方案

It is possible only if you implement custom SmtpAppender.

I have copied CustomSmtpAppender code from Log4net sourcecode Examples. hopefullly this will help you.

don't forget to refer CustomSmtpAppender in your app config

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;
    }
}

这篇关于在log4net的使用smtpAppender多smtphost地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆