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