log4net по сравнению с [закрытым] TraceSource

Вы можете использовать функцию formatter для всплывающей подсказки:

tooltip: {
    shared: true,
    formatter: function(e) {
        var points = this.points,
            i,
            result = '';

        function formatPoint(p, low, high) {
            return '\u25CF ' + p.series.name + ': ' + p.point.y + '% (' + low + '% -' + high + ' %)
' } for (i = 0; i < points.length; i += 2) { result += formatPoint(points[i], points[i + 1].point.low, points[i + 1].point.high) } return result } }

Живая демо: http://jsfiddle.net/BlackLabel/g3qeobaf/

[116 ] Справочник по API: https://api.highcharts.com/highcharts/tooltip.formatter

70
задан Community 23 May 2017 в 11:54
поделиться

5 ответов

Я думаю, что log4net делает каждый, что Вы перечислили для меня.

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

<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 только идет с ФАТАЛЬНОЙ ОШИБКОЙ, ПРЕДУПРЕЖДАЮТ ИНФОРМАЦИОННУЮ ОТЛАДКУ в порядке увеличивающегося многословия. Единственный, который я на самом деле пропускаю, является АУДИТОМ для входа who-did-what.

Настраиваемая конфигурация: Я использую 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")

Сервисное Средство просмотра трассировки: в 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, я не знаю, но при создании бобовых приложений подсчета толстого клиента, мне нравится отдельный файл конфигурации.

Все здесь - просто мои собственные небольшие приемы использования.

hth, - Майк

9
ответ дан Mike Bonnell 24 November 2019 в 13:30
поделиться

Причина, что я предпочитаю Log4Net использованию Трассировки одно из предназначения - с Log4Net, я могу независимо оснастить различные слои своего приложения (Доступ к данным, Сервисы, Бизнес-логика, и т.д.) и различные подсистемы (Аутентификация, Обработка, и т.д.) и стать включения - выключения журналирование каждой подсистемы независимо.

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

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

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

3
ответ дан Bevan 24 November 2019 в 13:30
поделиться

While Im only privy to the way log4net works, an obvious bonus to using that framework is immediate familiarity for those used to using log4j.

Another small benefit is that test driving logging using log4net is extremely simple; loggers implement log4net.ILog. Again Im not familiar with the Microsoft solution, but Im wondering how one would do this without first writing a facade to the System.Diagnostics.Trace class.

With a cursory look at the trace sources documentation, I could not find an equivalent to layouts, and would be interested to know if such an equivalent exists. The PatternLayout is quite handy for formatting log entries with common data like datestamps, thread info, log context etc. Log4net PatternLayout docs: http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

Additionally, given that writing extensions to a logging framework is probably a classic 'meta-problem', log4net does bring a grand list of pluggable listener equivalents to the table.

List of appenders: http://logging.apache.org/log4net/release/config-examples.html

0
ответ дан 24 November 2019 в 13:30
поделиться

См. этот ответ , чтобы узнать об эффективном способе получить подобъект нужного типа человека после запроса к таблице Person.

После того, как вы это заработаете, вы сможете удалить большую часть сложность тегов вашего шаблона за счет использования полиморфизма. Если вы хотите отображать каждый тип человека с использованием другого шаблона, сделайте это имя шаблона атрибутом класса модели или даже просто сделайте имя шаблона на основе имени модели (используя person._meta.module_name). Тогда один простой тег шаблона должен иметь возможность охватить все случаи, даже не зная каких-либо подробностей о том, какие подклассы существуют. РЕДАКТИРОВАТЬ Этот единственный тег нельзя зарегистрировать с помощью декоратора include_tag, потому что вам нужно будет определять имя шаблона динамически. Но это легко написать с помощью декоратора simple_tag:

@register.simple_tag
def show_person(person):
    t = template.loader.select_template(["%s.html" % person._meta.module_name,
                                         "person.html")
    return t.render({'person': person})

Это отобразит Worker с использованием worker.html, Retired с использованием retired.html и т. Д. Если конкретный шаблон для подтипа не найден, он возвращается к person.html по умолчанию.

Я бы предпочел, чтобы усилия, особенно после появления .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-формат средства просмотра служебной трассировки.

56
ответ дан 24 November 2019 в 13:30
поделиться

Еще одна причина для использования TraceSources вместо Log4Net - это сама трассировка: Log4Net можно использовать только для протоколирования (сообщений), но как отследить объект (множество информации одновременно)? Конечно, в Log4Net реализовано множество слушателей, но нужно ли мне все это? В большинстве случаев нет. А если мне нужен специальный слушатель, то не так уж сложно реализовать свой собственный, не так ли? Например, мне нужен слушатель для трассировки в базу данных (не только сообщений, но и различной информации {строки, инты и т.д.} одновременно).

Я прав?

4
ответ дан 24 November 2019 в 13:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: