Вот пример на простом языке. Я обеспечу корреспонденцию между высокоуровневыми человеческими понятиями к понятиям Python низкого уровня.
я хочу воздействовать на последовательность чисел, но я не хочу беспокоить мой сам созданием той последовательности, я хочу только сфокусироваться на операции, которую я хочу сделать. Так, я делаю следующее:
def
иннинг функция генератора, т.е. функция, содержащая yield
. .next()
на объекте генератора. StopIteration
исключение , функция генератора не должна повышать исключение. Это повышено автоматически, когда функциональные концы или выпуски a return
. Это - то, что делает генератор (функция, которая содержит yield
); это начинает выполняться, паузы каждый раз, когда это делает yield
, и, когда спросили относительно .next()
значение, это продолжается от точки, это было последним. Это соответствует отлично дизайном с протоколом итератора Python, который описывает, как последовательно запросить значения.
самый известный пользователь протокола итератора эти for
команда в Python. Так, каждый раз, когда Вы делаете a:
for item in sequence:
не имеет значения, если sequence
список, строка, словарь или генератор объект как описанный выше; результатом является то же: Вы читаете объекты от последовательности один за другим.
Примечание, что def
иннинг функция, которая содержит yield
ключевое слово, не является единственным способом создать генератор; это - просто самый легкий способ создать тот.
Для более достоверной информации, считайте [приблизительно 1 113] типы итератора , генераторы оператора и урожая в документации Python.
MemoryAppender будет только «добавлять» в память и поэтому в основном полезен только для целей разработки и тестирования. И в настоящее время нет приложения, которое будет добавляться только при завершении работы приложения.
SMTPAppender является чем-то средним, поскольку он наследует BufferingAppenderSkeleton . У этих добавлений есть свойство BufferSize, которое контролирует, сколько сообщений хранится в памяти до того, как они будут сброшены.
Какие сообщения передать в приложения, контролируются настройками уровня либо в корневом элементе, либо в отдельных элементах регистратора. В вашем случае используйте уровень WARN, который пропустит WARN, ERROR и FATAL. Если вам не нужны сообщения ERROR, вам нужно будет установить фильтр уровня в ваше приложение.
Обновление: MemoryAppender не использует никакой макет для «рендеринга» объектов сообщений. То, что вы получаете от MemoryAppender, - это просто необработанные объекты сообщений, поскольку они создаются log4net. Вам придется преобразовать их в осмысленный текст самостоятельно.
В качестве альтернативы, если вам требуются и функциональность компоновки, и добавление в памяти, вы можете изучить подкласс AppenderSkeleton . Таким образом вы получите базовую поддержку макета. При реализации метода Append вы можете делать то, что делает MemoryAppender, то есть просто добавлять к внутреннему списку сообщений.
Обновление 2 : Для реализации альтернативы MemoryAppender я предлагаю взять MemoryAppender в качестве отправной точки. MemoryAppender является подклассом AppenderSkeleton и, следовательно, имеет доступ к методу RenderLoggingEvent. Итак, мы создаем подкласс MemoryAppender и добавляем метод, который отображает текущий пакет событий журнала:
public class RenderingMemoryAppender : MemoryAppender
{
public IEnumerable<string> GetRenderedEvents()
{
foreach(var loggingEvent in GetEvents())
{
yield return RenderLoggingEvent(loggingEvent);
}
}
}
Вы можете использовать SMTPAppender и посмотреть, как работает функция очистки. Log4net хранит все сообщения в памяти до вызова сброса (если он настроен таким образом), поэтому электронное письмо будет отправлено, когда вы его очистите.
Еще вы можете создать отдельный аппендер (Rolling или FileAppender) с фильтрами WARN и FATAL, затем прикрепите это приложение к тому же регистратору и в конце вашего запуска отправьте этот файл по электронной почте, если он не пустой (и вы можете отправить его как вложение или прямо в теле письма). Дайте мне знать, если вам нужны подробности, это почти то же самое, что и я.
Удачи!
Рикардо.