【问题标题】:Nlog Email Target Programmatically以编程方式发送 Nlog 电子邮件目标
【发布时间】:2016-07-20 12:00:22
【问题描述】:

我有一个使用 NLog 日志库的程序。我有一个包含目标和规则的配置文件,我以编程方式添加了一些规则以写入数据库。直到现在一切正常。

现在我喜欢以编程方式更改配置。我用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”清除了以前的配置。我该如何防止呢? 感谢您的帮助!

【问题讨论】:

  • 你好。 Nlog 似乎不是这样工作的。这就是为什么我现在用.Net Mailing 类解决了它。我认为 Nlog 存在错误。

标签: c# vb.net nlog


【解决方案1】:
  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));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多