2010-02-19 14 views
9

Castle Windsor'un çalışması için log4net tümleştirmesi almaya çalışıyorum. Sınıfımı, ILogger türünde bir genel özellik ile yazdım ve yapılandırmayı aşağıdaki gibi app.config dosyasında aldım.Castle.Facilities.Logging ve log4net ile günlüğe kaydetme

<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> 

Gözlerimde bu çalışmalı, ancak çalışmıyor. loggingApi="console"'u ayarladığımda doğru şekilde günlüğe kaydeder. Log4net'e değiştirdiğimde hiçbir şey yapmaz. Log4net yapılandırması, bloğun çalıştığı başka bir projeden alınmıştır. Günlük dosyası kullanıldığı için ne yapmalıyım? Özel bir log4net yapılandırması olmalı mı? Herhangi ipucu için

Teşekkür

Boris

+0

sonunda işe yaradı mı? –

+0

Kodumda küçük bir değişiklik yaptıktan sonra, evet evet :) – Booser

cevap

9

ayrı bir dosya log4net.config için log4net yapılandırma getirin, ardından tesisin konfigürasyonu o dosyayı bakın: Eğer olmasını istiyorsanız

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

log4net yapılandırmanızın app.config dosyanızın bir bölümünde:

<facility 
    id="loggingfacility" 
    loggingapi="custom" 
    customLoggerFactory="[fully qualified type name of MyLog4NetFactory]" 
    type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging"/> 
+0

Bu benim düşündüğüm yoldu, ancak konfigürasyonun tek bir yerde olması fikrini beğendim. Ithink ben app.config yapılandırma yapılandırmak için bir yol almak için fabrika içine bakmak gerekir ... ama zaman zaman çoğu zaman statik olan günlüğü yapılandırma. İpucu için teşekkürler – Booser

+0

meraklı, gerekir 'configfile =" ... "' * * uygulama yapılandırması olamaz mı? @Boris yerine [[application.name] .exe.config' belirtirseniz ne olur? –

+0

@johnnyG: işe yaramaz –

1

Bu burada Home » MicroKernel/Windsor » Getting Started » Part 1 - The basics

<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> 

(eğer yapılandırma dosyasında yorumladı bölümleri görebileceğiniz gibi) ben yaptım hata verilen numune için tüm yapılandırma: olaraksonra tesis kayıt , Logger özelliğini bir kez daha sınıftaki kaleme üye olarak kaydettirmeye çalıştı. Kale bu işlemi sizin için otomatik olarak yapması gerekmiyor.

Alkış Badal

6

Özel bir günlük fabrika oluşturmadan log4net yapılandırma için App.config kullanabilirsiniz. Basitçe LoggingFacility yapıcısına bir argüman olarak App.config dosyasını sağlar: Mauricio Scheffer 'cevabı aksine

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

, varsayılan fabrika ConfigureAndWatch yapar. Bu, IIS'de veya izinleri kısıtlayan başka bir şey üzerinde çalışmama rağmen, App.config dosyasıyla benim için iyi çalışır.

Bunu kodda yapıyorum çünkü Log4net yapılandırmasını App.config dosyasından yüklemek için Windsor Xml yapılandırmasını güvenilir şekilde kullanamazsınız. Bunun nedeni, App.config öğesinin konumunun yeni bir AppDomain oluşturulduğunda değiştirilebilmesidir.

Çözümümün kullanılması, günlük dosyası yapılandırmasının kodunuzda derlenmesi anlamına gelir. Ama günlüğünü yapılandırmak için bir Windsor Installer kullanarak bu hafifletmek ve App.config dosyasından yükleyici (veya yükleyici montaj) belirtebilirsiniz:

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

...Farklı bir dosyadan günlük yapılandırmasını yüklemek zorunda ve ya yeniden derlemek istemiyorum olamaz gelecekte (belki test durumlarda) ise

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

, basitçe Windsor işaret edecek Xml değiştirmek farklı bir derlemede Yükleyenler:

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)); 
     } 
    } 
} 

ben sadece yöntem provid uyum sağlamış: son Kale sözleşmeler (me yanlışsa düzeltin) takiben

<castle> 
    <installers> 
     <install assembly="SomeOtherAssemblyName" /> 
    </installers> 
</castle> 
3

Not:

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

Bu kaydı için log4net kullanabilir ve uygulama yapılandırma dosyasında log4net yapılandırma bölümünde arayacaktır.

0

Aşağıdaki NuGet paketini kaçırıyordum.

Install-Package Castle.Windsor-log4net 

Castle.Windsor-log4net bunu düzeltildi.