Log4Net LevelEvaluator Игнорируется, когда bufferSize больше 1 для SmtpAppender

Я настроил log4net с помощью RollingLogFileAppender и SmtpAppender, с целью регистрации уровня DEBUG для RollingLogFileAppender и FATAL только для SmtpAppender:

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
  <to value="[email protected]" />
  <from value="[email protected]" />
  <subject value="Fatal Error" />
  <smtpHost value="smtp.test.com" />
  <SMTPPort value="366"/>
  <Username value="[email protected]"/>
  <Password value="password"/>      
  <bufferSize value="1" />
  <lossy value="true" />
  <evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="FATAL"/>
  </evaluator>      
  <layout type="log4net.Layout.PatternLayout">
  <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline"                             />
  </layout>
</appender>

<root>
  <level value="DEBUG" />
  <appender-ref ref="RollingLogFileAppender" />
  <appender-ref ref="SmtpAppender" />
</root>

Это работает отлично, пока я не увеличиваю bufferSize. Когда я это делаю, все уровни отправляются по электронной почте, а log4net.Core.LevelEvaluator, похоже, игнорируется. Я также пытался использовать LevelRangeFilter и LevelMatchFilter, но с этими настройками я вообще не получаю никаких писем.

Ответ 1

Оценщик не игнорируется, но он не выполняет то, что вы ожидаете: ваши настройки позволяют приложению добавить все сообщения журнала в буфер и отправить электронное сообщение только тогда, когда регистрируется сообщение с уровнем FATAL. Если буфер заполнен, самые старые сообщения отбрасываются (это параметр с потерями, без него вы также получите электронное письмо, как только будет заполнен буфер).

Если вы хотите отфильтровать сообщения, вам необходимо использовать фильтр. Например, например:

<filter type="log4net.Filter.LevelMatchFilter">
   <acceptOnMatch value="true" />
   <levelToMatch  value="FATAL" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />

Я не уверен, хотя, если бы я рассматривал свой почтовый appender как это, так как я хотел бы получить уведомление немедленно, если у моего приложения есть проблема, что ему нужно зарегистрировать его с уровнем FATAL.