записи хранилища c# log4net в памяти и электронной почте при определенных условиях

Вот пример на простом языке. Я обеспечу корреспонденцию между высокоуровневыми человеческими понятиями к понятиям Python низкого уровня.

я хочу воздействовать на последовательность чисел, но я не хочу беспокоить мой сам созданием той последовательности, я хочу только сфокусироваться на операции, которую я хочу сделать. Так, я делаю следующее:

  • я звоню Вам и говорю Вам, что хочу последовательность чисел, которая производится в особенном методе, и я сообщаю, каков алгоритм.
    Этот шаг соответствует def иннинг функция генератора, т.е. функция, содержащая yield.
  • Когда-то позже, я говорю Вам, "хорошо, подготовьтесь говорить мне последовательность чисел".
    Этот шаг соответствует вызыванию функции генератора, которая возвращает объект генератора. Примечание, что Вы еще не говорите мне чисел; Вы просто захватываете свою статью и карандаш.
  • я спрашиваю Вас, "скажите меня следующее число", и Вы говорите мне первое число; после этого Вы ожидаете меня для выяснения у Вас следующее число. Это - Ваше задание для запоминания, где Вы были, какие числа Вы уже сказали, и что является следующим числом. Я не забочусь о деталях.
    Этот шаг соответствует вызову .next() на объекте генератора.
  • †¦ повторяют предыдущий шаг, until†¦
  • в конечном счете, Вы могли бы закончиться. Вы не говорите мне число; Вы просто кричите, "держите свои лошади! Я сделан! Больше чисел!"
    Этот шаг соответствует объекту генератора, заканчивающему его задание и повышающему StopIteration исключение , функция генератора не должна повышать исключение. Это повышено автоматически, когда функциональные концы или выпуски a return.

Это - то, что делает генератор (функция, которая содержит yield); это начинает выполняться, паузы каждый раз, когда это делает yield, и, когда спросили относительно .next() значение, это продолжается от точки, это было последним. Это соответствует отлично дизайном с протоколом итератора Python, который описывает, как последовательно запросить значения.

самый известный пользователь протокола итератора эти for команда в Python. Так, каждый раз, когда Вы делаете a:

for item in sequence:

не имеет значения, если sequence список, строка, словарь или генератор объект как описанный выше; результатом является то же: Вы читаете объекты от последовательности один за другим.

Примечание, что def иннинг функция, которая содержит yield ключевое слово, не является единственным способом создать генератор; это - просто самый легкий способ создать тот.

Для более достоверной информации, считайте [приблизительно 1 113] типы итератора , генераторы оператора и урожая в документации Python.

9
задан Igor Brejc 26 February 2011 в 11:59
поделиться

2 ответа

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);
        }
    }
}
6
ответ дан 4 December 2019 в 23:07
поделиться

Вы можете использовать SMTPAppender и посмотреть, как работает функция очистки. Log4net хранит все сообщения в памяти до вызова сброса (если он настроен таким образом), поэтому электронное письмо будет отправлено, когда вы его очистите.

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

Удачи!

Рикардо.

1
ответ дан 4 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: