c # log4net хранить записи в памяти и электронной почте при определенных условиях - PullRequest
9 голосов
/ 07 августа 2009

В настоящее время я использую log4net с RollingFileAppender.

По мере выполнения каждого вызова журнала я бы хотел сохранить это в памяти . В конце работы моего консольного приложения я хотел бы (если для параметра app.config задано значение true) взять только предупреждения и летальные исходы и отправить все эти сообщения в электронном письме. Я замечаю MemoryAppender , но не совсем уверен, как его использовать. См. Также SMTPAppender , но не уверен, что это правильный инструмент, иначе я буду использовать MemoryAppender и каким-то образом отфильтровывать только события уровней Warn / Fatal, а затем отправлять электронную почту с использованием класса SmtpClient.

Как этого добиться?

Спасибо

Обновление

Моя последняя часть конфигурации log4net теперь выглядит следующим образом.

<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender" >
    <onlyFixPartialEventData value="true" />
    <threshold value="WARN" />
  </appender>  

  <root>
     <level value="DEBUG" />
    <appender-ref ref="Console" />
    <appender-ref ref="RollingFile" />
    <appender-ref ref="MemoryAppender" />    
  </root>

В коде я делаю:

private static MemoryAppender MemoryAppender
{
     get
     {
                if (memoryAppender == null)
                {
                    Hierarchy h = LogManager.GetRepository() as Hierarchy;
                    memoryAppender = h.Root.GetAppender("MemoryAppender") as MemoryAppender;
                }
                return memoryAppender;
            }
     }

Затем, когда мне нужны события, я звоню:

MemoryAppender.GetEvents ();

Я пробовал MemoryAppender.GetEvents () [0] .RenderedMessage, но это неверный вывод, как получить строку сообщения, которая была записана в журналы File / Console с правильным шаблоном и время и т. д. и создать себе StringBuilder? Затем я помещу это в тело своего электронного письма и отправлю с помощью SmtpClient. RenderMessage просто дает мне строку, которая была предоставлена ​​для вызова Log.Warn (), а не то, что было записано в журнал. Это связано с тем, что в MemoryAppender не задан шаблон макета?

Спасибо

Ответы [ 2 ]

6 голосов
/ 08 августа 2009

MemoryAppender будет только «добавляться» в память и, таким образом, в основном будет полезен только для целей разработки и тестирования. И в настоящее время нет приложения, которое будет добавляться только при завершении работы приложения.

SMTPAppender - нечто среднее, поскольку он наследует BufferingAppenderSkeleton . Эти дополнения имеют свойство BufferSize, которое контролирует, сколько сообщений хранится в памяти до их сброса.

Какие сообщения, передаваемые аппендерам, контролируются настройками уровня либо в корневом элементе, либо в отдельных элементах регистратора. В вашем случае используйте уровень WARN, который пропустит WARN, ERROR и FATAL. Если вы не хотите получать сообщения об ОШИБКАХ, вам нужно установить фильтр уровня для вашего аппендера.

Обновление: MemoryAppender не использует макет для "рендеринга" объектов сообщений. То, что вы получаете от MemoryAppender - это просто необработанные объекты сообщений, которые создаются log4net. Вы должны будете преобразовать их в значимый текст самостоятельно.

В качестве альтернативы, если вам требуются как функции макета, так и добавление в память, вы можете изучить подклассы AppenderSkeleton . Таким образом, вы получаете базовую поддержку Layout. При реализации метода 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);
        }
    }
}
1 голос
/ 07 августа 2009

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

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

Удачи!

Рикардо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...