我可以使用log4net在VB解决方案(Visual Studio 2010)中使用smtpappender和Gmail帐户将日志记录信息发送到电子邮件地址。收件人是在log4net配置文件中配置的,但是我希望能够动态更改收件人电子邮件地址。

是否可以不必编写自定义smtpappender?

答案是是还是否,请举个例子,最好是在VB中。

最佳答案

这是不可能的,当前的SmtpAppender不允许这样做。但是很幸运,SmtpAppender中的SendBuffer可以被覆盖,因此您可以轻松地向其中添加一些行为。我认为您最好的选择是使用LoggingEvent属性设置收件人:

public class MySmtpAppender : SmtpAppender
{
    protected override void SendBuffer(log4net.Core.LoggingEvent[] events)
    {
        var Recipients = events
            .Where(e => e.Properties.Contains("recipient"))
            .Select(e => e.Properties["recipient"])
            .Distinct();
        var RecipientsAsASingleLine = string.Join(";", Recipients.ToArray()); // or whatever the separator is
        var PreviousTo = To;
        To = RecipientsAsASingleLine;
        base.SendBuffer(events);
        To = PreviousTo;
    }
}

您可能需要更改选择收件人的方式,即您的 call 。

编辑 The tool recommended by stuartd效果很好(嗯,这是一个非常简单的类,但是仍然):
Public Class MySmtpAppender
    Inherits SmtpAppender
    Protected Overrides Sub SendBuffer(events As log4net.Core.LoggingEvent())
        Dim Recipients = events.Where(Function(e) e.Properties.Contains("recipient")).[Select](Function(e) e.Properties("recipient")).Distinct()
        Dim RecipientsAsASingleLine = String.Join(";", Recipients.ToArray())
        ' or whatever the separator is
        Dim PreviousTo = [To]
        [To] = RecipientsAsASingleLine
        MyBase.SendBuffer(events)
        [To] = PreviousTo
    End Sub
End Class

关于vb.net - log4net smtpappender自定义电子邮件收件人,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26054072/

10-11 19:20