Подтвердить что ты не робот

Когда log4net записывает или фиксирует журнал в файл?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Вы можете сделать это с помощью кода, как показано ниже:

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