2010-03-16 7 views
16

Мы используем log4net для регистрации событий и ошибок приложения winform. Наш клиент хочет проверить файл журнала во время запуска приложения. Но я не могу узнать, когда и как log4net выполняет операцию записи (фиксации). И как удовлетворить требования заказчика, за исключением того, что я создаю еще один регистратор. Любая помощь? Благодарю.Когда log4net записывает или фиксирует журнал в файл?

+0

Мы используем log4net в наших приложениях Windows Forms, и у нас нет никаких проблем. Между событием и обновлением файла существует некоторая латентность, но мы говорим о секундах. Может быть, проблема в другом месте? –

+1

Да, может быть, проблема нашего custormer - вторая ситуация. И мы решим эту проблему с помощью MemoryAppender, как сказал Питер. Спасибо всем, особенно Питер. Ваш ответ намного полезнее. – Jollian

ответ

8

Если вы используете FileAppender, это Appender наследует TextWriterAppender, который, в свою очередь, выставляет ImmediateFlush собственность. Значение этого свойства равно true и заставляет appender делать Flush() в базовом потоке для каждой операции добавления.

В зависимости от того, как вы представляете, как клиент «контролирует» файл журнала, идея может заключаться в том, чтобы обеспечить мониторинг из вашего приложения. Это можно сделать, помимо добавления к файлу, используя the MemoryAppender и считывая события из этого приложения.

-1

Вы говорите о файле журнала, поэтому предположительно вы используете FileAppender или производный класс. По умолчанию этот буфер будет выгружать. Буферизованный выход намного эффективнее, поэтому, чтобы удовлетворить ваши требования, я предлагаю вам предоставить некоторый механизм для очистки журнала перед его просмотром, вместо того, чтобы принудительно совершать фиксацию после каждой операции записи.

Вы можете сделать это с кодом, как следующее:

foreach (IAppender appender in LogManager.GetRepository().GetAppenders()) 
{ 
    BufferingAppenderSkeleton b = appender as BufferingAppenderSkeleton; 
    if (b != null) b.Flush(); 
} 
+1

«По умолчанию этот буфер будет выводиться». Это неправда! FileAppender (более конкретно его базовый класс TextWriterAppender) сбрасывается после каждой операции добавления! См. Http://logging.apache.org/log4net/release/sdk/log4net.Appender.TextWriterAppender.ImmediateFlush.html Поэтому вам не нужно ничего делать, потому что последние записи журнала всегда будут записываться в файл немедленно , так что ваш клиент может просто открыть файл. – gehho

+1

@gehho является правильным. FileAppender НЕ буферизует. Встроенные приставки, которые выполняют буферизацию, это AdoNet-, BufferingForwarding-, Remoting- и приставки SmtpXXX. –

1

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

Из-за этого вам необходимо убедиться, что ваша конфигурация вызывается с правильными учетными данными, в SharePoint это будет в повышенном контексте безопасности. Не совсем связано, но это может быть проблема, с которой вы сталкиваетесь.

0

см. this SO post для того, чтобы программно очистить журнал log4net. Ответ Джо, слегка неточный, примерно такой же код, и он предположительно будет работать для очистки всех буферизированных добавок.