Когда мне следует использовать Tracing vs Logger.NET, Enterprise Library, log4net или Ukadc.Diagnostics? - PullRequest
40 голосов
/ 23 января 2011

Как выбрать между стандартной трассировкой, Logger.NET, Enterprise Library, log4net или Ukadc.Diagnostics?

Есть ли ситуация, когда один более уместен, чем другой?... что бы это было?(ASP.NET, консольное приложение, Azure Cloud, SOHO, Enterprise ...)

Каковы преимущества или недостатки?

Я пропустил какие-либо другие основные структуры ведения журналов?

Ответы [ 6 ]

99 голосов
/ 24 января 2011

Есть много похожих вопросов здесь, на SO:

Вы пропустили несколько часто используемых каркасов журналирования.Вот список часто используемых платформ, некоторые из которых вы перечислили:

Абстракции ведения журнала:

Дополнения System.Diagnostics:

Other

Несколько других каркасов ведения журналов из codeplex (которые я виделупоминается здесь в SO):

Почему вы можете выбратьодин над другим?Это сложный вопрос.Во многом это личное предпочтение.Отчасти это техническое (или особенное) превосходство.

Одним очевидным недостатком любой среды ведения журналов (особенно сторонней) является качество поддержки.Что делать, если у вас есть проблемы с log4net, NLog, Common.Logging и т. Д.?Сможете ли вы получить исправления от разработчиков этих фреймворков?Это может быть не очень важно, так как исходный код доступен для этих платформ.Однако вы можете предпочесть НЕ «наследовать» исходное дерево только для того, чтобы исправить или добавить расширение.Я скажу, что фреймворки настолько расширяемы, что многие улучшения могут быть добавлены через обычные точки расширения.

Если вы читаете ссылки, которые я разместил выше, я думаю, что это будет справедливо, основываясь исключительно наОбъем благоприятных упоминаний о том, что log4net будет явным «победителем».Это будет упоминаться чаще как исторический фаворит и то, что многие люди будут использовать в будущем.

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

Enterprise Library часто рекламируется как хороший выбор, но почти так же часто рекламируется как ужасный выбор.,Может быть, какая-то его негативная репутация, возможно, не очень хорошие ранние версии?Может, сейчас лучше?

System.Diagnostics часто рекомендуется в качестве разумного выбора, по крайней мере, с тремя сильными преимуществами: отсутствие сторонней зависимости, многие компоненты Microsoft снабжены System.Diagnostics, его легко расширить (предположительно, для добавления некоторых функций, которыеуже присутствует "бесплатно" в таких фреймворках, как log4net и NLog?).Если вы используете System.Diagnostics, я думаю, что консенсус будет (как и моя рекомендация) использовать объекты TraceSource, а не Trace.WriteLine / Debug.WriteLine.

Обратите внимание, что System.Diagnostics и WCF хорошо работают вместе.Трафик сообщений WCF можно регистрировать с помощью System.Diagnostics, и WCF также будет распространять информацию о действиях System.Diagnostics (System.Diagnostics.CorrelationManager.ActivityId) через пограничные вызовы службы WCF.

Я не уверен, что log4net должен продолжать сохранять свой наиболее предпочтительный статус. Как уже было отмечено здесь, в SO, log4net, похоже, в последнее время не проходит большую разработку (обратите внимание, что я думаю, что "log4net is dead" - преувеличение), в то время как NLog 2.0 в настоящее время находится в бета-версии с окончательный выпуск ожидается в первом квартале 2011 года (обновление: NLog 2.0 был выпущен 17 июля 2011 года). Делает ли это NLog явно лучшим выбором, чем log4net? Я не знаю, но я думаю, что, условно говоря, NLog должен получать как минимум одинаковое внимание при выборе между этими двумя и, вероятно, должен быть предполагаемым фаворитом для новой разработки, по крайней мере, до тех пор, пока разработка log4net не покажет больше признаков жизни.

log4net и NLog предлагают очень гибкие опции конфигурации. Они позволяют вам иметь очень тонкую гранулярность в определении ваших операторов регистрации (по «стандартной» схеме определения регистратора для каждого типа). Они также позволяют легко расширять библиотеки, позволяя вам создавать свои собственные объекты «назначения журналирования» (log4net Appenders и NLog Targets) и объекты «форматирования» (конвертеры шаблонов log4net и NLog LayoutRenderers).

Помимо выбора структуры ведения журнала, некоторые (многие?) Выступают за изоляцию кода вашего приложения от жесткой зависимости от конкретной среды ведения журнала с помощью уровня абстракции. Это может принять форму вашего собственного интерфейса ILogger, который вы реализуете, возможно, поверх существующего фреймворка. В будущем вы могли бы изменить каркас, внедрив свой ILogger в другом каркасе. Или вы можете использовать DI / IoC для добавления "ILogger" в ваш код. Многие инфраструктуры DI / IoC предоставляют встроенную абстракцию ILogger, которую можно настроить на использование log4net, NLog или Enterprise Library или вы можете написать собственную реализацию ILogger и внедрить ее). Кому какое дело до реализации? Другой способ изолировать ваш код от жесткой зависимости от конкретной среды ведения журналов - это использовать существующую структуру абстракции ведения журнала, такую ​​как Common.Logging или SLF. Преимущество заключается в том, что, опять же, ваше приложение не зависит от конкретной структуры ведения журналов. Однако некоторые скажут, что вы только что обменяли одну зависимость (в каркасе логирования) на другую (каркас абстракции логирования).

Еще две заметки об абстракции логирования:

  1. Хорошая абстракция журналирования должна позволять вам захватывать выходные данные из разных каркасов журналирования в одном и том же выходном файле. Common.Logging называет это «мостом». Допустим, вы написали приложение с использованием Common.Logging, поддержанное NLog. Теперь скажите, что вы используете стороннюю библиотеку классов, которая написана с использованием log4net напрямую. С помощью системы мостов вы можете захватить выходные данные log4net (через пользовательский аппендер) и перенаправить их через Common.Logging, чтобы выходные данные журналов сторонней библиотеки классов можно было просматривать в контексте выходных данных журналов вашего приложения.

  2. Использование абстракции ведения журнала также позволяет вам тестировать каркасы ведения журналов во время разработки. Вы могли бы начать думать, что log4net - это тот путь, но вы хотите оставить себя открытым для попытки NLog. Используя абстракцию логирования, относительно легко переключаться между ними. В конечном счете, вы можете выбрать, какую среду ведения журналов, но в то же время вы смогли написать множество кода, который никак не зависит от конкретной среды ведения журналов.

Другая причина, по которой вы можете выбрать одну платформу вместо другой, - это среда, в которой вы работаете. Если вы уже используете часть Enterprise Library, этого может быть достаточно, чтобы подтолкнуть вас к использованию ведения журнала Enterprise Library.

Что если вы разрабатываете в Silverlight? Вы можете использовать что-то вроде Clog - часть кальция . Вы также можете использовать NLog 2.0, совместимый с Silverlight и WP7.

Аддоны System.Diagnostics (Ukadc.Diagnostics, Essential.Diagnostics).Это не каркасы журналирования как таковые.Скорее, они представляют собой наборы полезных объектов и точек расширения, которые можно использовать с существующей платформой System.Diagnostics.На мой взгляд, одна из лучших вещей, которую добавляет каждый из этих дополнений, - это возможность форматировать выходные данные журналов, подобно тому, как вы можете форматировать их с помощью log4net и NLog.Я не использовал Essential.Diagnostics, но я экспериментировал с Ukadc.Diagnostics и думаю, что это действительно круто.Даже легко написать свои собственные «жетоны форматирования».

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

5 голосов
/ 02 марта 2011

Я только начал использовать log4net в VS2010 и обнаружил, что он зависит от System.Web ..., что делает его несовместимым с целями платформы ".NET xx Client Profile" ... Учитывая то, что кто-то здесь опубликовал о Windows Обновление с использованием профиля клиента в качестве распространяемого .NET по выбору, это означает, что log4net больше не может быть средством выбора, если вы хотите, чтобы ваш код работал на большинстве машин ...

Спасибо за информацию о других опциях - я проверю их ...

3 голосов
/ 09 августа 2013

Просто добавим несколько вещей, извлеченных из конференции Microsoft Build 2013:

  • При большой нагрузке Log4NET выполняет запись в файл, главным образом потому, что этот процесс является синхронным.Можно получить разногласия и таймауты в определенных условиях.Это можно проверить с помощью AppDynamics или любого другого подобного инструмента.

  • NLog не реализует очереди, поэтому под нагрузкой IO-вызовы складываются.

  • По данным Microsoft, ETW использует кольцевые буферы ядра, что очень эффективно..NET 4.5 и инфраструктура журнала событий в сочетании с приложением семантического ведения журнала (AKA SLAB) сделают это намного более эффективным.

1 голос
/ 09 августа 2013

Я не фанат log4j или log4net.Мне нравится средство ведения журналов java.util.net, поэтому я по большей части воссоздаю его в проекте github с именем NetLog на https://github.com/greggwon/NetLog/. Не стесняйтесь оставлять отзывы.Я пытаюсь выделить некоторое время для установки конфигурации на основе ConfigurationManager вместо файла logging.properties.С java.util.logging всегда было достаточно легко использовать настройки свойств командной строки, чтобы указать, где находится конфигурация журнала.С сетью .net гораздо труднее, если вы не используете ConfigurationManager.Предоставление поддержки CM откроет двери для различных отношений между регистраторами и обработчиками, что может улучшить некоторые вещи.

NetLog включает EventLogHandler, который регистрирует журнал системных событий.Он также имеет уровень Level.EventLog, установленный чуть ниже «предупреждение», что позволит вам иметь именованный «уровень» для нацеливания на EventLog без использования «WARNING» или «SEVERE».У меня также есть TCPSocketHandler, который позволяет вам telnet в «журналирование», так что вы можете иметь «хвост» на окнах, без «хвостовой» программы.

0 голосов
/ 14 декабря 2016

По какой-то причине System.Diagnostics не поддерживает способ направить весь вывод трассировки одному слушателю. Если вы хотите, чтобы несколько источников были направлены к одному и тому же слушателю, вы должны явно перечислить каждый источник по имени.

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

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

0 голосов
/ 30 декабря 2013

Посмотрите на пакет NetLog.Logging на GitHub, это мое творение. У него есть приложение для мониторинга, и оно следует парадигме API java.util.logging, потому что это то, что мне нравится использовать. Он имеет спин-блокировку для доступа к «записи», и держатель блокировки записывает все записи, находящиеся в очереди, до предела, прежде чем двигаться дальше. Это позволит вести логирование с меньшим количеством конфликтов ввода-вывода и обеспечит хороший компромисс.

...