以编程方式更改SmtpAppender的主题

时间:2017-09-12 13:08:38

标签: log4net log4net-appender

我有SmtpAppender这样:

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="MyEmail@example.org" />
    <from value="SenderEmail@example.org" />
    <subject type="log4net.Util.PatternString" value="This is a subject" />
    <smtpHost value="smtp.host.value" />
    <authentication value="Basic" />
    <port value="587" />
    <username value="Username" />
    <password value="Password" />
    <bufferSize value="1" />
    <EnableSsl value="true"/>
    <lossy value="false" />
    <threshold value="ERROR" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%3thread] %-5level [%class].[%method] - %message%newline" />
    </layout>
</appender>

我想将我的代码中的日志邮件主题更改为我指定的字符串,以便它比标准主题更适合我的需求。

现在我就这样实现了。首先,我按名称找到SmtpAppender

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;
}

然后我可以改变这样的主题:

IAppender appender = FindAppenderByName("SmtpAppender");
SmtpAppender smtpAppender = (SmtpAppender)appender;
smtpAppender.Subject = "An error occured trying to convert the values";
log.Error("Error message");

但这似乎有点过于复杂,因为每次发送错误邮件时我首先必须按名称查找appender而我不想使用全局IAppender对象以及看起来似乎对我来说是不好的做法。

有没有办法将用户指定的错误消息用作主题,还是有可以使用的扩展方法?

1 个答案:

答案 0 :(得分:0)

我的建议如下:

  • 创建一个扩展SmtpAppender的新类
  • 覆盖SendBuffer
  • 根据您的LogginEvent,动态更改base.Subject

    public class CustomSmtpAppender : SmtpAppender
    {
        protected override void SendBuffer(LoggingEvent[] events)
        {
            PrepareSubject(events);
            base.SendBuffer(events);
        }
    
        protected virtual void PrepareSubject(IEnumerable<LoggingEvent> events)
        {
            //here you can eval events and set base.Subject
        }
    }