【问题标题】:How to make Log4Net send an Email with the From value set to the current users email address如何使 Log4Net 发送一封电子邮件,并将 From 值设置为当前用户的电子邮件地址
【发布时间】:2013-01-10 10:53:48
【问题描述】:

Log4Net Config Examples 网页上,它显示了有关如何设置 SmtpAppender 的示例。

所以我将以下设置添加到我的 app.config 文件中,并在记录警告或更高级别时成功发送电子邮件(这很好)。

<appender name="EmailAppender" type="log4net.Appender.SmtpAppender">
  <to value="me@mycompany.com" />
  <from value="me@mycompany.com" />
  <subject value="test logging message" />
  <smtpHost value="smtpserver.mycompany.com" />
  <lossy value="true" />
  <evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="WARN"/>
  </evaluator>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
  </layout>
</appender>

但是 From 值是用我的电子邮件地址硬编码的。

我的应用程序是一个 WinForms 应用程序,它将被部署到用户的 PC 上,因此知道哪个用户遇到了警告/错误会非常方便。

是否可以设置一个 Log4Net SmtpAppender 以便 From 值使用当前用户的电子邮件地址?

感谢您的帮助。

【问题讨论】:

  • 在日志中包含用户名不够吗?您可以使用表达式 %env{USERNAME} 在主题或日志消息中包含环境变量 %USERNAME%。

标签: c# log4net log4net-configuration log4net-appender


【解决方案1】:

有两个问题

1) 确定用户的电子邮件地址。如果它们是域的一部分,那么您可以尝试

  System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress

2)。在 Log4net 中使用它。应该可以使用属性来做到这一点,例如

如果你改变你的 app.config 来自

&lt;from value="me@mycompany.com" />

&lt;from type="log4net.Util.PatternString" value="%property{From}" />

并在程序中添加一行来设置属性,例如

log4net.GlobalContext.Properties["From"] = 
   System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress ;

您可能还需要将缓冲区大小设置为 1。

为了安全起见,最好将用户名也包含在错误消息中。

这种方法的缺点是,如果发件人地址丢失或不正确,电子邮件可能会丢失。

【讨论】:

  • 方便。只需更改 2 行代码。注意我必须在调用 log4net.Config.XmlConfigurator.Configure(); 之前设置属性;
  • 这是迄今为止我见过的针对这个特定问题的最干净的解决方案。为此干杯。
【解决方案2】:

这里是如何在运行时设置 SMTP 附加程序的简单示例。您可以设置 Smtp appender 的任何属性。将 FindAppenderByName 中的 appender name 参数设置为与配置中的 appender name 相同的名称。

    public static IAppender FindAppenderByName(string name)
    {
        ILoggerRepository rootRep = LogManager.GetRepository();
        foreach (IAppender iApp in rootRep.GetAppenders())
        {
            if (string.Compare(name, iApp.Name, true) == 0)
            {
                return iApp;
            }
        }
        return null;
    }

    private void SetupSmtpAppender()
    {
        IAppender appender = FindAppenderByName("Global.SmtpAppender");
        SmtpAppender smtpAppender = (SmtpAppender)appender;
        smtpAppender.From = "me@domain.com";
        smtpAppender.Subject = "My subject";
        smtpAppender.SmtpHost = "smtp@mydomain.com";
... setup more properties
    }

这是来自 log4net.config 的 sn-p:

<appender name="Global.SmtpAppender" type="log4net.Appender.SMTPAppender">
  <threshold value="WARN" />
</appender>

【讨论】:

    【解决方案3】:

    经过大量 Google 搜索后,我终于找到了这个很棒的 CodeProject article,它展示了如何使用 AppenderSkeleton 抽象类作为基础来创建新的自定义 Smtp Appender。

    它很简单,并且可以更改,以便在运行时动态设置 From 属性。它还展示了如何为 Subject 属性传递一个模式,以便您的电子邮件主题可以包含记录的事件级别和其他信息。

    例如

    <subject type="HHR.log4net.Layout.PatternLayout, HHR.log4net">
       <conversionPattern value="%date %level %exceptType at [%logger] on %property{log4net:HostName} by %username" />
    </subject>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 2013-12-16
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多