Многопоточная безопасная регистрация

У нас есть приложение, которое работает в нескольких потоках и использует Log4Net в качестве среды ведения журнала. Мы столкнулись с сценарием, когда некоторые события журнала не регистрировались. Как упоминалось в документах, FileAppender, а другие Appenders " не безопасны для многопоточных операций". Я искал в Интернете решения или Appenders, но не смог найти их.
Вы знаете многопоточный безопасный Log4Net Appender, который использует кольцевой буфер или очередь для обеспечения многопоточной поддержки? Или мы должны использовать другую многопоточную систему безопасного ведения журнала?
Спасибо заранее!

+8
источник поделиться
4 ответа

Я написал несколько тестов Unit, чтобы воспроизвести проблему: тест создает 50 потоков, и каждый поток регистрирует 500 сообщений. Затем были подсчитаны письменные строки, и в результате я получил 25 000 (50 x 500) строк в другом порядке. Я тестировал его на двухъядерном процессоре и на восьмиядерном компьютере.
Я тестировал статический регистратор:

private static ILog StaticLog = log4net.LogManager.GetLogger(RepositoryName, "Static logger");

и с регистратором для каждого экземпляра тестового класса/потока:

ILog instanceLog = LogManager.GetLogger(RepositoryName, "Instance logger: " + ThreadId.ToString());


И все тесты были зелеными.

Таким образом, Log4Net отлично работает и хорошо справляется с многопоточными сценариями. Документы Appender следует обновить и указать, что многопоточные операции поддерживаются, если API Logger используется правильно.

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

Спасибо за вашу помощь!

+13
источник

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

log.Info("message");
+8
источник

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

Подробнее о нескольких потоках и log4net здесь: здесь и здесь

0
источник

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

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

Это легко доказать. См.: https://www.codeproject.com/Tips/1219696/Log-Net-Singleton-Wrapper-for-Concurrent-Logging

То, что я сделал, - это "обернуть" функции Log4Net в статическом одиночном потоке, который является потокобезопасным, а затем помещать каждое сообщение журнала в очередь, запущенную в параллельном потоке. Это сделает все протоколирование одновременно с приложением, но выполнение приложения не дожидается завершения добавления.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос