2010-06-25 2 views
4

В настоящее время у меня есть собственная система ведения журнала, где журнал по существу представляет собой очередь, с отдельным потоком, прослушивающим эту очередь и выполняющим все операции записи. Система обрабатывает TON сообщений журнала, файлы могут легко превышать 10 МБ в минутах, поэтому фактическое ведение журнала в вызывающем потоке невозможно.Запуск приложений Log4Net по отдельной теме

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

Возможно ли это без создания обертки log4net?

ответ

1

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

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

+0

MSMQ очень тяжеловес, особенно для этого. Очередь в памяти достаточно. –

+0

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

+0

Поскольку он использует очередь, порядок ведения журнала будет соответствовать порядку вставки, поэтому проблем не будет. –

1

Это неплохая идея. Хитрость заключается в том, чтобы помещать в очередь записи и обрабатывать их в одной очереди. Посмотрите на http://www.drdobbs.com/visualstudio/225700095 для хорошего примера.

1

Вы всегда можете посмотреть исходный код для log4net, чтобы избежать этих вопросов. Это с открытым исходным кодом.

+0

Немного сложнее выкопать в огромной библиотеке классов. Тем не менее, поиск нового потока ничего не возвращает, поиск ThreadPool показывает приложение, которое «вроде» делает что-то полезное для моих целей, но нигде не находится рядом с меткой. Угадай, что я должен сделать свой собственный appender. :( –

0

При использовании .NET Framework 4 можно использовать BlockingCollection, чтобы сохранить последовательность записей в журнале

0

Я использовал ParallelForwardingAppender и AsyncForwardingAppender appenders с большим успехом. Эти appenders доступны из следующего хранилища:

https://github.com/cjbhaines/Log4Net.Async

ParallelForwardingAppender использует BlockingCollection и другие аспекты параллельной библиотеки задач для реализации очереди сообщений без потерь меньше.

AsyncForwardingAppender использует кольцевой буфер и период опроса в течение 10 мс в фоновом потоке, чтобы приоритезировать производительность приложения по точности ведения журнала.

Смежные вопросы