Log4Net и протоколирование из параллельных экземпляров

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

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

Когда я использую параметр "log4net.Appender.FileAppender + MinimalLock, есть случаи потери информации. Не все журналы из обоих экземпляров сохраняются в файле.

Как я могу решить эту проблему и зарегистрировать информацию из параллельных экземпляров? Что же касается ухудшения производительности, когда я использую параметр "MinimalLock"?

Спасибо. Надеюсь на вашу помощь.

Ответ 1

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

<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value="log_%processid.log" />
  </file>
<!-- ... -->

Ответ 2

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

Раскрытие информации. Я являюсь автором этого продукта.

Ответ 3

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

Ответ 4

Вы можете создать собственный пользователь, который откроет файл для записи, а затем закроет его. Если он попадает в заблокированный файл, он может приостановить и повторить попытку несколько раз.

В пользовательском приложении вы также можете открыть файл в режиме совместной записи, который позволит использовать несколько авторов, но это не предотвратит объединение частей строк журнала.

Если вы не пишете много данных, механизм открытия/закрытия, указанный выше, вероятно, является вашим лучшим вариантом. Обратите внимание, что из-за постоянного открытия и закрытия файла вы можете увидеть заметное влияние на производительность, если вы регистрируете большое количество данных.

Более сложный механизм, но тот, который может обеспечить высокопроизводительный путь ведения журнала: Напишите службу регистрации, которая получает строки журнала через TCP или UDP. Служба будет отвечать за буферизацию данных и запись их на диск. Мы использовали этот подход в прошлом (не через Log4Net, а в качестве общего решения) для повышения эффективности записи журнала.

Ответ 5

Определенно рассмотрим создание разных файлов журналов для каждого процесса, возможно, с уникальными именами файлов, сгенерированными с использованием метки времени.

Ответ 6

Вместо MinimalLock, использующего InterProcessLock, можно уменьшить потерю данных, когда несколько процессов обращаются к одному файлу журнала.

log4net.Appender.FileAppender+InterProcessLock