Правильный способ использования log4net (именование логгера) - PullRequest
79 голосов
/ 17 августа 2011

Существует два способа настройки и использования log4net.Во-первых, когда я могу настроить свой собственный appender и связанный регистратор:

<!-- language: xml -->

<appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" >
    <file value="Logs\myLog.log" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level - %message%n" />
    </layout>
</appender>

<logger name="myLog">
    <level value="All"></level>
    <appender-ref ref="myLogAppender" />
</logger>

А потом, когда я хочу что-то записать в журнал, я могу сделать следующее:

ILog log = LogManager.GetLogger("myLog");
log.Info("message");

ДругойЧтобы использовать его, нужно настроить root так, чтобы он был настолько подробным, насколько я хочу:

<!-- language: xml -->

<root>
    <level value="Error" />
    <appender-ref ref="myLogAppender" />
</root>

И в этом случае я могу регистрировать сообщения следующим образом:

ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");

Преимущества второго подходаявляется то, что вы можете включить или отключить некоторые сообщения на лету.Но проблема в том, что я занимаюсь разработкой в ​​EPiServer CMS, и у нее есть собственная система ведения журнала, которая использует log4net, и если я включу ведение журнала информации на корневом уровне, то будет записано много системных журналов.

Как вы используете log4net?Каждая часть системы пишет в своем собственном логгере, или все записывается в логгере по умолчанию, и конфигурация решает, что делать дальше?

Ответы [ 4 ]

94 голосов
/ 17 августа 2011

Относительно того, как вы регистрируете сообщения в коде, я бы выбрал второй подход:

ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");

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

MyNamespace.Foo.Bar [INFO] message

Преимущество этого подхода состоит в том, что он является де-факто стандартом для организации ведения журнала, он также позволяет фильтровать сообщения журнала по пространству имен. Например, вы можете указать, что хотите регистрировать сообщение уровня INFO, но повысить уровень ведения журнала для Bar специально до DEBUG:

<log4net>
    <!-- appenders go here -->
    <root>
        <level value="INFO" />
        <appender-ref ref="myLogAppender" />
    </root>

    <logger name="MyNamespace.Foo.Bar">
        <level value="DEBUG" />
    </logger>
</log4net>

Возможность фильтровать ваши записи по имени - мощная функция log4net, если вы просто регистрируете все свои сообщения на "myLog", вы теряете большую часть этой мощи!

Что касается EPiServer CMS, вы должны быть в состоянии использовать вышеупомянутый подход для указания другого уровня ведения журнала для CMS и вашего собственного кода.

Для дальнейшего чтения, вот статья кода проекта, которую я написал при ведении журнала:

9 голосов
/ 31 декабря 2016

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

2 Файлы должны быть изменены при реализации Log4net.


  1. Добавить ссылку log4net.dll в проект.
  2. app.config
  3. Файл класса , в котором вы будете реализовывать журналы.

Внутри [ app.config ]:

Во-первых, в разделе «configSections», вам нужно добавить ниже кусок кода;

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

Затем, в блоке 'configuration', вам нужно написать приведенный ниже фрагмент кода. (Этот фрагмент кода настраивается в соответствии с моими потребностями, но работает как шарм.)

<log4net debug="true">
    <logger name="log">
      <level value="All"></level>
      <appender-ref ref="RollingLogFileAppender" />
    </logger>

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="log.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <maxSizeRollBackups value="1" />
      <maximumFileSize value="1MB" />
      <staticLogFileName value="true" />

      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %C.%M [%line] %-5level - %message %newline %exception %newline" />
      </layout>
    </appender>
</log4net>

Внутри Класс вызова :

Внутри класса, в котором вы собираетесь использовать этот log4net, вам нужно объявить ниже кусок кода.

 ILog log = LogManager.GetLogger("log");

Теперь вы готовы вести журнал вызовов, где вы хотите в том же классе. Ниже приведен один из методов, которые можно вызывать при выполнении операций.

log.Error("message");
4 голосов
/ 28 марта 2017

Вместо того, чтобы называть свой вызывающий класс, я начал использовать следующее:

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Таким образом, я могу использовать одну и ту же строку кода в каждом классе, который использует log4net, не забывая об изменении кодакогда я копирую и вставляю.В качестве альтернативы, я мог бы создать класс ведения журнала, и каждый другой класс наследовал бы от моего класса ведения журнала.

0 голосов
/ 09 мая 2017

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

...