2016-07-20 3 views
0

У меня есть программа, которая использует библиотеку протоколов NLog. У меня есть файл конфигурации с целями и правилами, я добавляю программно некоторые правила для записи в базу данных. До сих пор все работает нормально.Nlog Email Target Programmatically

Теперь мне нравится менять конфигурацию программно. Я использую SimpleConfigurator

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Fatal) 

мой VB код выглядит следующим образом:

Dim target As MailTarget = New MailTarget() 
target.Name = "Mailing" 
target.Html = True 
target.Body = "${message}" 
target.SmtpServer = EmailSending.SendingServer 
target.From = EmailSending.EmailSender 
target.Encoding = System.Text.Encoding.UTF8 
target.[To] = EmailSending.EmailReceiver 
target.EnableSsl = EmailSending.EnableSSl 
target.SmtpPort = EmailSending.sendingPort 
target.SmtpUserName = EmailSending.EmailSender 
target.SmtpPassword = EmailSending.EmailsenderPw 

и теперь добавляя этот материал к конфигурации:

LogManager.Configuration.AddTarget("Mailing", target) 
Dim MailTarget As NLog.Targets.Target = LogManager.Configuration.FindTargetByName("Mailing") 
Dim loggerRule As NLog.Config.LoggingRule = New NLog.Config.LoggingRule("*", LogLevel.Fatal, MailTarget) 
LogManager.Configuration.LoggingRules.Add(loggerRule) 

Новая цель и правило работает, но " simpleconfigurator "очистить предыдущую конфигурацию. Как я могу это предотвратить? Спасибо за помощь!

+0

Здравствуйте еще раз. Похоже, что Nlog работает не так. Вот почему я решил его теперь с классом .Net Mailing. Я думаю, что есть ошибка с Nlog. –

+0

Что такое ошибка? – Julian

ответ

0
  1. Пропустить с помощью SimpleConfigurator действительно, вы можете использовать LogManager.Configuration.LoggingRules.Add (или проще один LogManager.Configuration.AddRule(...))

  2. Если автоматическая перезагрузка включена, программно добавленные правила и цели будут ясны. Вы должны использовать события ConfigurationChanged событий

Что-то вроде этого:

VB.NET:

Private Sub Init() 
    UpdateNLogConfig(Nothing, Nothing) 
    AddHandler LogManager.ConfigurationReloaded, AddressOf UpdateNLogConfig 
End Sub 

Private Sub UpdateNLogConfig(sender As Object, e As LoggingConfigurationReloadedEventArgs) 

    Dim target = New MailTarget() 
    target.Name = "Mailing" 
    target.Html = True 
    target.Body = "${message}" 
    target.SmtpServer = EmailSending.SendingServer 
    target.From = EmailSending.EmailSender 
    target.Encoding = System.Text.Encoding.UTF8 
    target.[To] = EmailSending.EmailReceiver 
    target.EnableSsl = EmailSending.EnableSSl 
    target.SmtpPort = EmailSending.sendingPort 
    target.SmtpUserName = EmailSending.EmailSender 
    target.SmtpPassword = EmailSending.EmailsenderPw 
    LogManager.Configuration.AddTarget("Mailing", target) 
    LogManager.Configuration.AddRuleForOneLevel(LogLevel.Fatal, target) 
    'or LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Fatal,target)); 
End Sub 

C#

private void Init() 
{ 
    UpdateNLogConfig(null, null); 
    LogManager.ConfigurationReloaded += UpdateNLogConfig; 
} 

private void UpdateNLogConfig(object sender, LoggingConfigurationReloadedEventArgs e) 
{ 

    var target = new MailTarget(); 
    target.Name = "Mailing"; 
    target.Html = true; 
    target.Body = "${message}"; 
    target.SmtpServer = EmailSending.SendingServer; 
    target.From = EmailSending.EmailSender; 
    target.Encoding = System.Text.Encoding.UTF8; 
    target.To = EmailSending.EmailReceiver; 
    target.EnableSsl = EmailSending.EnableSSl; 
    target.SmtpPort = EmailSending.sendingPort; 
    target.SmtpUserName = EmailSending.EmailSender; 
    target.SmtpPassword = EmailSending.EmailsenderPw; 
    LogManager.Configuration.AddTarget("Mailing", target); 
    LogManager.Configuration.AddRuleForOneLevel(LogLevel.Fatal, target); //or LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Fatal,target)); 
}