如何使Log4Net发送电子邮件并将发件人设置为当前用户的电子邮件地址

9
Log4Net配置示例网页上,展示了如何设置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应用程序,将部署到用户的个人计算机上,因此知道哪个用户遇到了警告/错误非常方便。

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

感谢您的帮助。


1
仅在日志中包含用户名是否就足够了呢?您可以使用表达式%env{USERNAME}将环境变量%USERNAME%包含在主题或日志消息中。 - Dirk Trilsbeek
3个回答

7

有两个问题:

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

  System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress

2). 在Log4net中使用它应该是可能的,可以使用属性进行设置,例如

如果您更改您的app.config文件从

<from value="me@mycompany.com" />

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

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

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

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

建议在错误消息中包含用户名作为一部分,以确保安全。

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


只需两行代码即可轻松完成。请注意,在调用log4net.Config.XmlConfigurator.Configure()之前,我必须设置属性。 - Matthew Lock
这绝对是我见过的针对这个特定问题最干净的解决方案。谢谢你。 - Top Cat

5

以下是一个简单的示例,展示如何在运行时设置 SMTP appender。您可以设置 Smtp appender 的任何属性。在 FindAppenderByName 中将 appender 名称参数设置为与配置文件中的 appender 名称相同。

    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的片段:
<appender name="Global.SmtpAppender" type="log4net.Appender.SMTPAppender">
  <threshold value="WARN" />
</appender>

4

在经过大量的谷歌搜索后,我终于找到了这篇CodeProject文章,它展示了如何使用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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接