Вход с помощью Castle.Facabilities.Logging и log4net - PullRequest
9 голосов
/ 19 февраля 2010

Я пытаюсь заставить работать интеграцию log4net для Castle Windsor.Я написал свой класс с открытым свойством типа ILogger и взял конфигурацию в моем app.config, как показано ниже.

<configuration>
  <configsections>
    <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configsections>

  <castle>
    <facilities>
      <facility id="logging" type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" />
    </facilities>
    <components>
      <component id="form1" type="WinFormsActiveRecordSample.Form1, WinFormsActiveRecordSample" />
    </components>
  </castle>
  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="FileAppender" />
    </root>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="main.log" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{dd.MM.yy HH:mm:ss} %-5level %logger - %message%newline" />
      </layout>
    </appender>
  </log4net>
</configuration>

В моих глазах это должно работать, но это не так.Когда я устанавливаю loggingApi="console", он регистрируется правильно.Когда я изменяю это на log4net, это ничего не делает.Конфигурация log4net была взята из другого проекта, где работает блок.Что мне нужно сделать, чтобы файл журнала использовался?Должна ли быть специальная конфигурация log4net?

Спасибо за любую подсказку

Борис

Ответы [ 6 ]

9 голосов
/ 19 февраля 2010

Переместите конфигурацию log4net в отдельный файл log4net.config, а затем обратитесь к этому файлу из конфигурации объекта:

<facility id="loggingfacility" configfile="log4net.config" loggingapi="log4net" type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging"/>

Если вы хотите, чтобы ваша конфигурация log4net находилась в разделе вашего app.config:

public class MyLog4NetFactory: Log4netFactory {
    public MyLog4NetFactory() {
        XmlConfigurator.Configure();
    }

    public override ILogger Create(String name) {
        ILog log = LogManager.GetLogger(name);
        return new Log4netLogger(log.Logger, this);
    }

    public override ILogger Create(String name, LoggerLevel level) {
        throw new NotSupportedException("Logger levels cannot be set at runtime. Please review your configuration file.");
    }
}

затем зарегистрируйте объект как:

<facility 
  id="loggingfacility" 
  loggingapi="custom" 
  customLoggerFactory="[fully qualified type name of MyLog4NetFactory]" 
  type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging"/>
6 голосов
/ 15 апреля 2011

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

container
    .AddFacility("logging",
        new LoggingFacility(LoggerImplementation.Log4net,
            System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)
        )

В отличие от ответа Маурисио Шеффера, фабрика по умолчанию имеет значение ConfigureAndWatch.Это прекрасно работает для меня с файлом App.config, хотя я не работаю на IIS или чем-то еще, что ограничивает разрешения.

Я делаю это в коде, потому что вы не можете надежно использовать ВиндзорКонфигурация XML для загрузки конфигурации log4net из App.config.Это связано с тем, что местоположение App.config можно изменить при создании нового AppDomain.

Использование моего решения означает, что конфигурация файла журнала будет скомпилирована в ваш код.Но вы можете уменьшить это, используя установщик Windsor для настройки ведения журнала и указав установщик (или сборку установщика) из файла App.config:

public class LoggingInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container
            .AddFacility("logging",
                new LoggingFacility(LoggerImplementation.Log4net,
                    System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)
                );
    }
}

...

<castle>
    <installers>
        <install assembly="MyAssemblyName" />
    </installers>
</castle>

Если в будущем (возможно, в ваших тестовых примерах) вам придется загружать конфигурацию ведения журнала из другого файла и не можете или не хотите перекомпилировать, просто измените Xml, чтобы он указывал на Установщики Windsor в другой сборке:

<castle>
    <installers>
        <install assembly="SomeOtherAssemblyName" />
    </installers>
</castle>
3 голосов
/ 10 ноября 2013

Обратите внимание, что в последних версиях Castle вы можете использовать следующее:

container.AddFacility<LoggingFacility>(f => f.UseLog4Net().WithAppConfig());

Это будет использовать Log4net для регистрации и поиска раздела конфигурации log4net в файле конфигурации приложения.

1 голос
/ 06 сентября 2010

Это полная конфигурация для примера, приведенного здесь. Home »MicroKernel / Windsor» Начало работы »Часть 1. Основы

<configuration>
  <configSections>
    <section
        name="castle"
        type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
  </configSections>


  <castle>
    <facilities>
    <facility
         id="logging"
         type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging"
         loggingApi="log4net"
         configFile="D:\\Backup-E\\My Work\\.NET\\CastleWindsorPOC\\CastleWindosorApp\\CastleWindosorApp\\Log4Net.xml" />
    </facilities>
    <components>
      <component
          id="httpservicewatcher"
          type="CastleWindosorApp.HttpServiceWatcher, CastleWindosorApp" >
        <parameters>
          <notifiers>
            <array>
              <item>${email.notifier}</item>
              <item>${alarm.notifier}</item>
            </array>
          </notifiers>
          <Url>test url</Url>
          <!--<Logger>${logger.component}</Logger>-->
        </parameters>
      </component>

      <component
          id="email.notifier"
          service="CastleWindosorApp.IFailureNotifier, CastleWindosorApp"
          type="CastleWindosorApp.EmailFailureNotifier, CastleWindosorApp" />

      <component
          id="alarm.notifier"
          service="CastleWindosorApp.IFailureNotifier, CastleWindosorApp"
          type="CastleWindosorApp.AlarmFailureNotifier, CastleWindosorApp" />
     <!--<component
          id="logger.component"
          service="Castle.Core.Logging.ILogger, Castle.Core"
          type="Castle.Services.Logging.Log4netIntegration.Log4netLogger, Castle.Services.Logging.Log4netIntegration" />-->
      <component
          id="form.component"
          type="CastleWindosorApp.Form1, CastleWindosorApp" />


    </components>

  </castle>

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

Приветствие Badal

0 голосов
/ 02 февраля 2017

Мне не хватало следующего пакета NuGet.

Castle.Windsor-log4net

Install-Package Castle.Windsor-log4net

Исправлено.

0 голосов
/ 31 октября 2013

Следуя недавним соглашениям о замке (поправьте меня, если ошибаюсь), я решил это следующим образом:

using Castle.Facilities.Logging;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;

namespace EVRM.Aspects.Container.Installers
{
   public class LoggingInstaller : IWindsorInstaller
    {
       public void Install(IWindsorContainer container, IConfigurationStore store)
       {
           container.AddFacility<LoggingFacility>(f => f.UseLog4Net(System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile));
       }
    }
}

Я просто адаптировал метод, представленный здесь: http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Five-Adding-logging-support.ashx

и использовал перегрузку UseLog4Net (), которая принимает параметр файла конфигурации.

...