简体   繁体   中英

Nlog Email Target Programmatically

I have a program which uses the NLog logging library. I have a config file with targets and rules, I add programmatically some rules to write to a database. Until now everything works fine.

Now I like to change the config programmatically. I use SimpleConfigurator

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

my VB Code looks like that:

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

and now adding this stuff to the config:

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)

The new target and rule works, but the "simpleconfigurator" clear previous configuration. How do I prevent that? Thanks for help!

  1. Skip using the SimpleConfigurator indeed, you can use LogManager.Configuration.LoggingRules.Add (or the easier one LogManager.Configuration.AddRule(...) )

  2. If auto reload is enabled, the programmatically added rules and targets will be clear. You need to use the events ConfigurationChanged event

Something like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM