8

Вопрос по .net, multithreading, log4net, logging, c# – Многопоточное безопасное ведение журнала

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

Знаете ли вы многопоточный безопасный Log4Net Appender, который использует кольцевой буфер или очередь для обеспечения многопоточной поддержки? Или нам вообще следует использовать другую многопоточную безопасную систему ведения журналов?

Заранее спасибо!

<span>Спасибо за ответ. Я написал несколько модульных тестов, которые подтверждают безопасность многопоточности Log4Net (см. Ответ ниже).</span>

Oct 05, 2009, 2:58 PMотRene Schulte

<span>Дубликат<a href="http://stackoverflow.com/questions/1294668">stackoverflow.com/questions/1294668</a> - в основном, log4net будет использовать приложение соответствующим образом для вас.</span>

Oct 05, 2009, 10:16 AMотJon Skeet

4ответа

14

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

Я проверил статический Logger:

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

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

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



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



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



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



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

8

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

log.Info("message");
0

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

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

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

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

0

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

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

RelatedQuestions