2014-09-26 2 views
2

Я могу использовать log4net для отправки информации о регистрации на адрес электронной почты, используя smtpappender и учетную запись Gmail в решении VB (Visual Studio 2010). Получатель настроен в файле конфигурации log4net, однако я хотел бы иметь возможность динамически изменять адрес электронной почты получателя.log4net smtpappender пользовательские получатели электронной почты

Возможно ли это без необходимости писать пользовательский smtpappender?

Wether ответ да или нет, пожалуйста, дайте мне пример, желательно в VB.

+2

Вы можете преобразовать ответ @ samy в VB.Net по адресу http://www.developerfusion.com/tools/convert/csharp-to-vb/ – stuartd

ответ

3

Это невозможно, текущий SmtpAppender не позволит этого. Но вам повезло, SendBuffer в SmtpAppender можно переопределить, поэтому вы можете легко добавить к нему какое-то поведение. Я думаю, вам лучше всего использовать свойства LoggingEvent установить получатель:

public class MySmtpAppender : SmtpAppender 
{ 
    protected override void SendBuffer(log4net.Core.LoggingEvent[] events) 
    { 
     var Recipients = events 
      .Where(e => e.Properties.Contains("recipient")) 
      .Select(e => e.Properties["recipient"]) 
      .Distinct(); 
     var RecipientsAsASingleLine = string.Join(";", Recipients.ToArray()); // or whatever the separator is 
     var PreviousTo = To; 
     To = RecipientsAsASingleLine; 
     base.SendBuffer(events); 
     To = PreviousTo; 
    } 
} 

Вы можете захотеть изменить способ выбора получателей, ваш звонок.

редактироватьThe tool recommended by stuartd работает довольно хорошо (ну, это является довольно простой класс, но все же):

Public Class MySmtpAppender 
    Inherits SmtpAppender 
    Protected Overrides Sub SendBuffer(events As log4net.Core.LoggingEvent()) 
     Dim Recipients = events.Where(Function(e) e.Properties.Contains("recipient")).[Select](Function(e) e.Properties("recipient")).Distinct() 
     Dim RecipientsAsASingleLine = String.Join(";", Recipients.ToArray()) 
     ' or whatever the separator is 
     Dim PreviousTo = [To] 
     [To] = RecipientsAsASingleLine 
     MyBase.SendBuffer(events) 
     [To] = PreviousTo 
    End Sub 
End Class 
0

это возможно. see my answer in this question - скопировал код ниже

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

Это не отвечает на вопрос, так как он не устанавливает получателя. – stuartd

+0

Чтобы задать свойство динамически - просто log4net.ThreadContext.Properties ["ToEmail"] = ToEmailAddress; – swapneel

+0

swapneel, я не вижу, где вы извлекаете свойство ToEmail, уверены ли вы, что у вас нет кода? – samy

0

Вы можете использовать класс log4Net.GlobalContext.

код:

App.config

<appender name="SmtpLogAppender" type="log4net.Appender.SmtpAppender"> <to type="log4net.Util.PatternString" value="%property{SenderList}"/>

C# Код

GlobalContext.Properties["SenderList"] = "[email protected], [email protected]"; 
log4net.Config.XmlConfigurator.Configure(); 
0

Это возможно, до некоторой степени, чтобы получить динамический получателя.

В приложении SMTP заменяются команды To, CC, From и т. Д. Во время настройки. Не идеально (было бы лучше, если бы было вычислять значения при каждой отправке), но все же работоспособно.

Повторная настройка ведения журнала не является бесплатной, но выполнима программно. Вы можете настроить поле Кому, как, например:

<to type="log4net.Util.PatternString" value="[email protected]%property{MailRecipient}" /> 

затем в своем коде вы можете задать через запятую список получателей, как это:

log4net.GlobalContext.Properties["MailRecipient"] = "[email protected],[email protected]"; 

важный бит, что вы вынуждаете повторную конфигурацию ПОСЛЕ того, как вы установите эти значения. Точный синтаксис будет зависеть от вашей стратегии конфигурации, мы используем центральный конфигурационный файл для всех лесозаготовок так в C# это будет выглядеть следующим образом:

log4net.Config.XmlConfigurator.ConfigureAndWatch("PathToYourCentralFile.xml"); 

и вуаля! Динамический получатель без каких-либо пользовательских приложений!

Лично я бы предпочел пользовательский appender, менее хакерский, поскольку он не требует постоянной переконфигурации, если вам нужно часто менять их.Но если вам нужно только 10-минутное исправление, и конфиг для получателя не меняется после запуска, я нашел это достаточно хорошим.

Смежные вопросы