Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

log4net.Appender.FileAppender+InterProcessLock
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top