2009-02-23 4 views
67

В this thread многие люди указали, что они используют log4net. Я поклонник TraceSources и хотел бы знать, почему используется log4net.log4net versus TraceSource

Вот почему я люблю источники трассировки:

  • Pluggable слушателей - XML, TextFile, Console, EventLog, сверните свои собственные
  • Настраиваемый следовые выключатели (ошибка, предупреждение, информация, многословен, начало, конец , изготовленный на заказ)
  • Настраиваемая конфигурация
  • каротажного Блок приложений просто большой набор TraceListeners
  • Корреляция деятельности/областей (например, ассоциированную все журналы в пределах ASP.NET г equest с данным клиентом
  • Служба просмотра трассировки позволяет визуализировать события в отношении этих действий отдельно
  • Все это настраивается в файле app.config/web.config.

Поскольку среда .NET внутренне использует TraceSources, она также дает мне последовательный способ настройки трассировки - с помощью log4net я должен настроить log4net, а также TraceSources.

Что такое log4net, что у TraceSources нет (или это невозможно сделать, написав пару пользовательских TraceListeners)?

+22

Я нашел этот вопрос достойным SO, а также нашел несколько ответов, чтобы быть достаточно информативным, чтобы больше не искать больше информации. Тот, кто закрыл этот вопрос как «неконструктивный», я задаю вопрос, было ли это сделано из-за предвзятости к log4net и общего недовольства линией ответов. Этот вопрос и многие ответы помогают прояснить страх, неопределенность, сомнения и простые дезинформации, связанные как с log4net, так и с трассировкой .NET. –

+3

Я также нашел этот вопрос полезным. И на самом деле точно соответствует тому, что я искал. – Darkonekt

ответ

9

Я думаю, что log4net делает все, что вы указали для меня.

Подключаемые слушатели звучат как приставки - их много, и на самом деле я даже взломал скользящий файл журнала, который всегда заканчивается на .log (для ассоциаций файлов), добавлен поле cc в приложение электронной почты и, наконец, настроен мои любимые значения для цветного консольного приложения. Если я могу быть настолько смелыми - мои цветные консоли счастья:

<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 
<!-- Can Use: 
     Blue 
     Green 
     Red 
     White 
     Yellow 
     Purple 
     Cyan 
     HighIntensity 
     --> 
<mapping> 
    <level value="FATAL" /> 
    <foreColor value="Yellow, HighIntensity" /> 
    <backColor value="Red" /> 
</mapping> 
<mapping> 
    <level value="ERROR" /> 
    <foreColor value="White" /> 
    <backColor value="Purple, HighIntensity" /> 
</mapping> 
<mapping> 
    <level value="WARN" /> 
    <backColor value="Blue" /> 
    <foreColor value="White" /> 
</mapping> 
<mapping> 
    <level value="INFO" /> 
    <backColor value="Green" /> 
    <foreColor value="White" /> 
</mapping> 
<mapping> 
    <level value="DEBUG" /> 
    <foreColor value="White" /> 
</mapping> 
<layout type="log4net.Layout.PatternLayout"> 
    <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />--> 
    <!--<conversionPattern value="%-5level %file:%line - %message%newline" />--> 
    <conversionPattern value="%level %logger:%line %newline  %message%newline" /> 
</layout> 

Настраиваемый след выключатели: Log4Net поставляется только с FATAL ERROR WARN INFO DEBUG в порядке возрастания многословием. Единственное, что я действительно пропустил, - это AUDIT для тех, кто сделал-что записывал.

Настраиваемая конфигурация: Я использую файл log4net.config который я загрузить во время выполнения (или записи журнала в C:. \ Ныть, что я не могу найти конфигурации)

Try 
     ' Get log4net configuration from file 
     Dim logConfigFile As FileInfo 
     logConfigFile = New FileInfo(".\log4net.config") 

     If logConfigFile.Exists Then 
      XmlConfigurator.Configure(logConfigFile) 
     Else 
      CreateEmergenceLogFile(logConfigFile.FullName) 
     End If 

    Catch ex As Exception 
     Console.Out.WriteLine("Could not load the log4net config file") 
    End Try 

просто большой набор TraceListeners: извините, пропустив этот, я возьму ваше слово.

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

В файле класса:

Private Shared _logger As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) 

Private Shared _loggerAttribute As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Attribute") 

Private Shared _loggerCache As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Cache") 

The Service Трассировка просмотра: в log4net .config:

<logger name="NipissingU.ADWrapper.EntryTools.Attribute"> 
    <level value="INFO" /> 
    </logger> 
    <logger name="NipissingU.ADWrapper.EntryTools.Cache"> 
    <level value="WARN" /> 
    </logger> 

Все это настраивается в app.config/web.config: ну, может быть, что это хорошая вещь в ASP.NET, я не знаю, но когда делает богатый клиент боба счетных приложений Мне нравится отдельный файл конфигурации.

Все здесь - только мои собственные небольшие трюки.

НТН, -Mike

+0

спасибо Майку. Корреляция немного отличается - вы можете связать руководство и метаданные о «контексте» журнала - все следы оттуда до тех пор, пока контекст не будет «закрыт», затем будут связаны с этим контекстом. упрощает просмотр всех журналов, относящихся к определенному заказу или клиенту, например, –

+0

, в отличие от того, что разные файлы журналов на клиента/порядок могут быть довольно раздражающими. –

+0

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

3

Причина, по которой я предпочитаю Log4Net использовать Trace для одного из таргетинга - с Log4Net я могу независимо обрабатывать различные уровни моего приложения (Data Access, Services, Business Logic и т. Д.) И различные подсистемы (аутентификация, обработка и т. Д.), и включить/выключить ведение журнала каждой подсистемы самостоятельно.

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

Статические методы, предоставляемые в классе Trace [такие как TraceInformation()], не дают возможности указать, из какой подсистемы ведет запись, поэтому это не так легко обеспечить, написав мой собственный TraceListener.

Другая причина - производительность - есть часть моего приложения, которое может регистрировать несколько тысяч сообщений в секунду. Log4Net накладывает небольшие накладные расходы. В отличие от этого, в прошлый раз, когда я посмотрел на него, блок приложения Logging Application перефразировал его конфигурацию XML для каждого зарегистрированного сообщения, что сделало блок очень тяжелым и медленным.

+12

Re: targetting - TraceSource предоставляет это.Вы можете настроить несколько параметров TraceSources и настроить их по отдельности. –

+1

Re: производительность. Я был бы удивлен, если это все еще так, но это, безусловно, то, что я буду исследовать. Как люди справляются с чтением тысяч сообщений журнала в секунду? :) –

+1

Я знал, что курс чтения скорости пригодится – stimms

0

Хотя Im только причастен к тому, как log4net работает, очевидный бонус к использованию этих рамок является непосредственное знакомство для тех, кто привык использовать log4j.

Еще одно небольшое преимущество заключается в том, что ведение журнала вождения с использованием log4net чрезвычайно просто; loggers реализуют log4net.ILog. Опять же, я не знаком с решением Microsoft, но мне интересно, как это сделать без предварительного написания фасада для класса System.Diagnostics.Trace.

С беглым взглядом на документацию источников трассировки я не мог найти эквивалент макетов, и было бы интересно узнать, существует ли такой эквивалент. Функция PatternLayout весьма удобна для форматирования записей журнала с общими данными, такими как datestamps, информация о потоке, контекст журнала и т. Д. Log4net PatternLayout docs: http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

Кроме того, учитывая, что письменные расширения для структуры ведения журналов, вероятно, являются классической «мета-проблемой», , log4net действительно приводит к большому списку подключаемых эквивалентов слушателя к таблице.

Список appenders: http://logging.apache.org/log4net/release/config-examples.html

+0

См. Проект Essential Diagnostics на Codeplex (http://essentialdiagnostics.codeplex.com/) для System.Diagnostics TraceListener с поддержкой шаблонов/форматов, а также интерфейс и фасад для TraceSource (хотя вы можете протестировать, просто подключив тестовый трассировщик). –

54

В самые первые дни (.NET 1.0) отслеживании в .NET Framework был довольно ограничен.

Например, разбиение на TraceSource произошло не до .NET 2.0, и у вас было только четыре уровня (ошибка, предупреждение, информация, подробный), хотя вы могли бы использовать полдюжины булевых переключателей для разбиения на разделы, если хотите.

log4j является популярным на Java и поэтому получил большую поддержку для .NET-порта, и как только он стал популярным, он остался таким, хотя люди даже не используют его должным образом (например, обертывая его в singleton logger и потерять основную функцию).

Тем не менее, я думаю, что log4net и другие фреймворки (например, NLog, Common.Logging и даже EntLib) пошли не так, реализовав свою собственную систему ведения журнала с нуля, то есть изменив даже то, как вы записываете записи журнала в первое место.

Я бы очень хотел увидеть усилие, тем более, что .NET 2.0 вложил в прочную основу того, что уже есть в .NET. Для проекта, который расширяет то, что уже существует, посмотрите проект Essential Diagnostics на CodePlex (http://essentialdiagnostics.codeplex.com/).

Некоторые сильные стороны log4net:

  • Он похож на log4j, если вы работаете в смешанной среде и хотят последовательной протоколирования.

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

  • log4net уже имеет около 28 приложений (эквивалентно прослушивателям трассировки), в то время как System.Diagnostics имеет только 10 (но см. Проект Essential.Diagnostics для более), поэтому, если вы действительно думаете, что вам может понадобиться RemoteSyslogAppender, NetSendAppender, AnsiColorTerminalAppender или TelnetAppender, тогда вам повезло.

Недостатки (по сравнению с System.Diagnostics):

  • Вы должны использовать другой синтаксис протоколирования, так что если вы уже используете source.TraceEvent(), вам нужно пройти и заменить все.

  • Это также распространяется на различные синтаксисы для корреляции, поэтому вам нужно перейти из контекста CorrelationManager в log4net.

  • Не легко интегрируется с трассировкой Framework (например, WCF).

  • Плохая поддержка идентификаторов событий (необходимо использовать отдельный проект расширения IEventLog).

  • Пока не поддерживает трассировку событий для Windows (Vista) или XML-формат Service Trace Viewer.

4

Другая причина для использования TraceSources вместо Log4Net прослеживает себя: Log4Net может быть использована только для Logging (сообщений), но как отследить объект (несколько информации в то же время)? Конечно, в Log4Net есть много Слушателей, но мне нужно все это? В большинстве случаев нет. И если мне нужен специальный слушатель, это не так сложно реализовать мою собственную, не так ли? Например, я нуждаюсь в прослушивателе для отслеживания в базе данных (а не только сообщений, но различной информации {строка, int и т. Д.) Одновременно).

Я прав?

+0

Действительно, я считаю, что вы (по крайней мере, на стороне TraceSource) – Mark

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

  • Нет связанных вопросов^_^