Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使Log4Net发送一封设置了From值的电子邮件到当前用户的电子邮件地址_C#_Log4net_Log4net Configuration_Log4net Appender - Fatal编程技术网

C# 如何使Log4Net发送一封设置了From值的电子邮件到当前用户的电子邮件地址

C# 如何使Log4Net发送一封设置了From值的电子邮件到当前用户的电子邮件地址,c#,log4net,log4net-configuration,log4net-appender,C#,Log4net,Log4net Configuration,Log4net Appender,在网页上,它展示了如何设置SmtpAppender的示例 因此,我在app.config文件中添加了以下设置,并在记录警告或更高级别时成功发送电子邮件(这很好) 但是From值是用我的电子邮件地址硬编码的 我的应用程序是一个WinForms应用程序,它将被部署到用户PC上,因此知道哪个用户遇到警告/错误非常方便 是否可以设置Log4Net SmtpAppender,以便From值使用当前用户的电子邮件地址 谢谢你的帮助。有两个问题 1) 确定用户的电子邮件地址。如果它们是域的一部分,那么您可

在网页上,它展示了如何设置SmtpAppender的示例

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


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

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

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

谢谢你的帮助。

有两个问题

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

  System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress
2) 。在Log4net中使用它。应该可以使用属性来实现这一点,例如

如果您从更改app.config

并在程序中添加一行以设置属性

log4net.GlobalContext.Properties["From"] = 
   System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress ;
您可能还需要将缓冲区大小设置为1

为了安全起见,最好也将用户名作为错误消息的一部分


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

经过大量的谷歌搜索,我最终发现了一个很棒的例子,展示了如何使用AppenderSkeleton抽象类作为基类创建新的自定义Smtp Appender

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

e、 g


以下是如何在运行时设置SMTP appender的简单示例。您可以设置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中的代码段:

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


在日志中包含用户名就足够了吗?您可以使用表达式%env{USERNAME}在subject或log message.handy中包含环境变量%USERNAME%。只有两行代码需要更改。注意:在调用log4net.Config.XmlConfigurator.Configure()之前,我必须设置属性;这是迄今为止我见过的针对这个特殊问题的最干净的解决方案。为此干杯。
<appender name="Global.SmtpAppender" type="log4net.Appender.SMTPAppender">
  <threshold value="WARN" />
</appender>