Это на самом деле не проблема кодирования, но я после некоторого отзыва сообщества о некоторых проблемах, которые возникают у меня, при разработке новой реализации Logger.
Фон
наше приложение ASP.NET изначально работало с log4net. Хотя log4net - отличный инструмент для ведения журнала, он не соответствует нашим потребностям, а в некоторых случаях даже вызывает проблемы для нашего приложения в процессе ведения журнала. В настоящее время мы внедряем нашу собственную систему ведения журналов, которая имитирует некоторое поведение log4net, но также адаптирована к нашим потребностям. Я здесь не для того, чтобы обсуждать использование log4net или как его настроить.
System
В настоящее время у нас разрабатывается система. Система имеет класс логгера, который является Singleton ( недостаток дизайна, я знаю ... ), и этот класс имеет коллекцию IReporter объектов.
Каждый раз, когда приложение вызывает Logger.Instance.Log (сообщение) , регистратор будет направлять эти сообщения каждому IReporter внутри очереди, а репортеры несут ответственность за регистрацию сообщения. в месте назначения / хранения / что угодно.
В настоящее время мы выбрали, чтобы каждый IReporter имел фоновую ветку и очередь сообщений для обработки сообщений с их собственной скоростью. Опасность заключается в том, что когда приложение внезапно умирает, мы можем потерять некоторые сообщения.
Другим подходом, который мы имели в виду, было создание пула потоков на регистраторе, позволяющего этим потокам проходить через очередь, а затем делегировать сообщения репортерам.
Что меня беспокоит, так это производительность. Сначала мы реализовали это, используя события в логгере, но порождаемые потоки быстро теряли скорость доступа к файлу. Поэтому теперь при таком подходе мы надеемся ограничить доступ к ресурсам
Я смотрю на людей, которые сталкивались с подобными ситуациями и как они подошли к этой проблеме.