m_c*_*ard 8 c# log4net log4net-configuration log4net-appender
在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>
Run Code Online (Sandbox Code Playgroud)
但是From值是用我的电子邮件地址硬编码的.
我的应用程序是一个WinForms应用程序,它将部署到用户PC,因此知道哪个用户遇到警告/错误会非常方便.
是否可以设置Log4Net SmtpAppender以使From值使用当前用户的电子邮件地址?
谢谢您的帮助.
有两个问题
1)确定用户的电子邮件地址。如果它们是域的一部分,那么您可以尝试
System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress
Run Code Online (Sandbox Code Playgroud)
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 ;
Run Code Online (Sandbox Code Playgroud)
您可能还需要将缓冲区大小设置为1。
为了安全起见,建议将用户名也作为错误消息的一部分。
这种方法的缺点是,如果发件人地址丢失或不正确,则电子邮件可能会丢失。
以下是如何在运行时设置SMTP appender的简单示例.您可以设置Smtp appender的任何属性.将FindAppenderByName中的appender name参数设置为与配置中的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
}
Run Code Online (Sandbox Code Playgroud)
这是来自log4net.config的片段:
<appender name="Global.SmtpAppender" type="log4net.Appender.SMTPAppender">
<threshold value="WARN" />
</appender>
Run Code Online (Sandbox Code Playgroud)
经过大量 Google 搜索后,我终于找到了这篇很棒的CodeProject 文章,其中展示了如何使用 AppenderSkeleton 抽象类作为基础来创建新的自定义 Smtp Appender。
它很简单,并且可以更改,以便在运行时动态设置 From 属性。它还演示了如何传递主题属性的模式,以便您的电子邮件主题可以包含记录的事件级别和其他信息。
例如
<subject type="HHR.log4net.Layout.PatternLayout, HHR.log4net">
<conversionPattern value="%date %level %exceptType at [%logger] on %property{log4net:HostName} by %username" />
</subject>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12120 次 |
| 最近记录: |