9

Castle Windsor の log4net 統合を機能させようとしています。タイプのパブリック プロパティを使用してクラスを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 構成が必要ですか?

ヒントをありがとう

ボリス

4

6 に答える 6

9

log4net 構成を別のファイル log4net.config に移動し、ファシリティ構成からそのファイルを参照します。

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

app.config のセクションに log4net 構成を含める場合:

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"/>
于 2010-02-19T19:53:41.220 に答える
6

カスタム ログ ファクトリを作成せずに、log4net 構成に App.config を使用できます。App.config ファイルを引数としてLoggingFacilityコンストラクターに渡すだけです。

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

Mauricio Scheffer の答えとは異なり、デフォルトのファクトリはConfigureAndWatch. これは、App.config ファイルで問題なく機能しますが、IIS やその他のアクセス許可を制限するものでは実行していません。

Windsor Xml 構成を確実に使用して App.config から log4net 構成を読み込むことができないため、これをコードで行っています。これは、新しい を作成するときに 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>
于 2011-04-14T23:33:10.200 に答える
1

これは、ホーム » 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 プロパティを割り当てようとしたことです。これは、Castle が自動的に行うため、必須ではありません。

乾杯バダル

于 2010-09-06T07:01:27.120 に答える
0

最近のCastleの慣習に従って(間違っていたら訂正してください)、私はこのように解決しました:

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() のオーバーロードを使用しました。

于 2013-10-30T20:11:08.743 に答える