Настроить или расширить log4net SmtpAppender с помощью настраиваемых тем

Как я могу указать макет и шаблон преобразования для темы получающегося электронного письма?

BufferSize должен быть меньше или равен 1, чтобы буферизация не происходила.


person Daniel Ballinger    schedule 10.10.2010    source источник


Ответы (4)


Статья CodeProject log4net NonBufferedSmtpAppenderWithSubjectLayout выглядит многообещающе.


Наследуя необходимый базовый аппендер (в моем случае SmtpPickupDirAppender) и добавляя свойство ILayout, можно изменить тему в методе Append.

public class SmtpSubjectLayoutPickupDirAppender : log4net.Appender.SmtpPickupDirAppender
{
    public SmtpSubjectLayoutPickupDirAppender()
        : base()
    {

    }

    public ILayout SubjectLayout
    {
        get;
        set;
    }

    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
    {
        if (this.BufferSize <= 1 && this.SubjectLayout != null)
        {
            StringWriter subjectWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
            this.SubjectLayout.Format(subjectWriter, loggingEvent);
            this.Subject = subjectWriter.ToString();
        }

        base.Append(loggingEvent);
    }
}

Затем это можно настроить, указав свойство subjectLayout для переопределения темы по умолчанию.

<appender name="SmtpPickupDirAppender" type="namespace.for.SmtpSubjectLayoutPickupDirAppender">
    <to value="[email protected]" />
    <from value="[email protected]" />
    <subject value="test logging message" />

    <subjectLayout type="log4net.Layout.PatternLayout, log4net">
        <conversionPattern value="Logging message - %message"/>
    </subjectLayout>

    <pickupDir value="C:\SmtpPickup" />
    <bufferSize value="1" />
    <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>
person Daniel Ballinger    schedule 10.10.2010
comment
Для настраиваемых свойств: ‹conversionPattern value=Сообщение регистрации — %property{myVal}/› ThreadContext.Properties[myVal] = независимо; - person Jeroen K; 03.04.2013
comment
public ILayout SubjectLayout должно быть public PatternLayout SubjectLayout, чтобы это работало. - person TheCodeKing; 02.07.2013

Вот еще один пример SmtpAppender с настраиваемыми темами.

person VladV    schedule 09.02.2011

Вы можете скачать его с Nuget.

Исходный код и пример

person Alexander Byndyu    schedule 26.05.2013

Поскольку в предыдущих ответах, предлагающих использовать версию SmtpAppenderWithSubjectLayout NuGet, требуется версия log4net › 1.2.1, я использовал исходный код NuGet, но изменил его для использования log4net 1.2.1.

public class SmtpAppenderWithSubjectLayout : SmtpAppender
{
    public PatternLayout SubjectLayout { get; set; }

    protected override void SendBuffer(LoggingEvent[] events)
    {
        PrepareSubject(events);

        base.SendBuffer(events);
    }

    protected virtual void PrepareSubject(IEnumerable<LoggingEvent> events)
    {
        var subjects = new List<string>();

        foreach (LoggingEvent @event in events)
        {
            if (Evaluator.IsTriggeringEvent(@event))
            {
                var subjectWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
                SubjectLayout.Format(subjectWriter, @event);
                subjects.Add(subjectWriter.ToString());
            }
        }

        Subject = string.Join(", ", subjects.ToArray());
    }
}
person Riccardo Bassilichi    schedule 29.06.2014