Лучшие практики по созданию библиотеки логгеров с помощью log4net. Является

Моя цель - создать библиотеку log4net, которую можно использовать в нескольких проектах.

В моем решении, которое находится в .net 4.0, я создал библиотеку классов под названием Logger и ссылался на нее из веб-проекта.

Теперь я создал logger.config в библиотеке классов и поместил всю конфигурацию в файл logger.config. Затем я использовал

[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "Logger.config")]

Когда я запускаю веб-приложение, ничего не регистрируется. Итак, я добавил эту строку кода в web.config

<add key="log4net.Internal.Debug" value="true"/> 

который дал мне отладочную информацию и информацию об ошибках

Не удалось найти раздел конфигурации log4net в файле .config приложения. Проверьте свой файл .config на наличие элементов и. Раздел конфигурации должен выглядеть так:

Я переместил конфигурацию из logger.config в web.config, и, похоже, все работает нормально.

Мне не нужна конфигурация log4net в web.config, но я использую logger.config как более чистый подход. Цель состоит в том, чтобы заставить другие проекты использовать эту библиотеку и не беспокоиться о настройке в каждом проекте.

Теперь вопрос: как мне это сделать? Что я делаю неправильно? Любое предложение с примером кода будет полезно всем.

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


person VolleyBall Player    schedule 31.05.2012    source источник
comment
Я бы посоветовал не создавать библиотеку логгеров - просто используйте log4net напрямую. Возможно, создайте несколько методов расширения на ILog, если вам это действительно нужно.   -  person default.kramer    schedule 06.06.2012
comment
вы пробовали сбросить файл logger.config в папку bin?   -  person mithun_daa    schedule 06.06.2012
comment
Я подозреваю, что вы не настроили файл конфигурации на копирование всегда или копирование, если новее при сборке. Для таких файлов обычно установлено значение «Не копировать».   -  person pms1969    schedule 12.06.2012
comment
Где находится ваш файл logger.config? В библиотеке классов Logger или в проекте, который ее использует? Кроме того, как вы разрешаете регистратор от вашего IOC?   -  person Maciej    schedule 12.06.2012


Ответы (3)


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

http://slf.codeplex.com/

http://netcommon.sourceforge.net/

Они наиболее распространены в приложениях .Net.

Что ж, если вы настаиваете на использовании своей собственной абстракции (которая действительна), вот мое предложение:

Прежде всего, я предполагаю, что у вас будет что-то вроде:

interface ILogger
{
    void Debug(string message);
    void Info(string message);
    void Warn(string message);
    …..
}

Хорошо, поэтому в свой код вы должны вставить одноэлементную ссылку на свой регистратор, например:

x.For<ILogger>().Singleton().Use<MyLogger>();

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

Самый простой и наиболее многоразовый способ, который я нашел для этого, - это поместить конфигурацию во внешний файл, как вы прокомментировали, тогда я не буду беспокоиться о вызове XmlConfigurator в коде, потому что для меня проще просто добавить пару настроек приложения в мой файл конфигурации вроде этого

<!-- Relative to the application root path -->
<add key="log4net.Config" value="Logger.log4net"/>
<add key="log4net.Config.Watch" value="True"/>

Вот и все. Эти настройки приложения имеют приоритет над вашей конфигурацией log4net, и их легко поддерживать. Ваш файл конфигурации будет выглядеть так:

<?xml version="1.0" encoding="utf-8" ?>

<!-- This section contains the log4net configuration settings -->
<log4net>

  <!-- Define some output appenders -->

  <appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
    <file value="webapp-log.txt" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
    </layout>
  </appender>

  <!-- Setup the root category, add the appenders and set the default priority -->

  <root>
    <level value="DEBUG" />
    <appender-ref ref="LogFileAppender" />
  </root>

</log4net>

Чтобы настроить другие приложения: нажмите здесь

В ваших проектах вам нужна только ссылка на компонент абстракции вашего регистратора, и просто в веб-проекте (или приложении Windows, это то же самое) добавьте файл конфигурации log4net и только эти настройки приложения.

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

person Jupaol    schedule 10.06.2012
comment
Log4net - это проблема. Буду загружать документы с комментариями и выходным текстом. Я дам вам награду, поскольку вы ближе всех подходите к тому, что я собираюсь делать. - person VolleyBall Player; 12.06.2012

Возможно, для вашего веб-приложения вы можете попробовать загрузить файл конфигурации в свой application_start (gloabal.asax.cs)

    void Application_Start(object sender, EventArgs e)
    {
        log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("Logger.config")));
    }
person Hyralex    schedule 09.06.2012

Вы можете попробовать следующее: http://forums.asp.net/t/1739162.aspx/1 или этот . По умолчанию веб-приложение будет обращаться только к своему основному файлу webconfig и конфигурациям из областей / папки, если они есть. Убедитесь, что вы включили все необходимые конфигурации, как показано ниже, в новый appConfig для log4net:

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

  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="logfile.txt"/>
      <appendToFile value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline"/>
      </layout>
    </appender>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="FileAppender"/>
    </root>
  </log4net>

p.s. проверьте и этот ответ: Может ли web.config читать из внешний XML-файл? Убедитесь, что вы также развернули файл конфигурации, если web.config его не включает.

person radu florescu    schedule 07.06.2012