Как я могу указать макет и шаблон преобразования для темы получающегося электронного письма?
BufferSize должен быть меньше или равен 1, чтобы буферизация не происходила.
Как я могу указать макет и шаблон преобразования для темы получающегося электронного письма?
BufferSize должен быть меньше или равен 1, чтобы буферизация не происходила.
Статья 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>
public ILayout SubjectLayout
должно быть public PatternLayout SubjectLayout
, чтобы это работало.
- person TheCodeKing; 02.07.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());
}
}