0

Castle Windsor ロギング機能を使用していますが、うまく機能しています。インターセプターとイベントに接続する機能を登録するインストーラーを持っているので、Castle と log4net の両方を意識せずにほとんどのコードを幸せに保つことができます。

私の登録のほとんどはコードで行われますが、ロギングのために、次のように web.config (最初にインストールされます) に接続しています。

<castle>        
    <facilities>
         <facility id="logging"
              type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" />
    </facilities>
    <installers>
        <install type="MyProject.LoggerInstaller,MyProject" />
    </installers>
</castle>

その理由は、本番環境に移行するときに、この構成セクションを含める必要がないからです。また、log4net から nlog へ、必要に応じてその場で簡単に切り替えられることも意味します。そして、私のコンポーネントがlog4netを直接参照する必要がないことを意味します。

私が抱えている問題は、登録フェーズ自体でログを使用したいということです。私がこれを行っているのは、登録が少し複雑で、何が起こっているのか、どれくらいの時間がかかっているのかを簡単に監視できるようにしたいからです。(主に、プラグイン型システムを使用しているためです。)

私の LoggerInstaller では、 ILoggerFactory を解決して、ロガーを作成し、ユーティリティ オブジェクトでそのロガーのイベントをフックできるようにしようとしています。しかし、これはこれで失敗します:

ComponentNotFoundException: No component for supporting the service Castle.Core.Logging.ILoggerFactory was found

Castle のソースを調べてみると、すべてのインストーラーはどの機能よりも前にインストールされていると思われるため、インストーラー内で機能が初期化されていないようです。XML 構成を介してイベントが発生しないようにイベントを接続するためだけに 2 番目のインストーラーを作成すると動作しますが、関連するすべてのログを一緒にログに記録したいと考えています。利用できません。(そして、ログが有効になっているかどうかをどうにかして把握する必要があります..??)

Castle Logging 機能をインストーラーから登録したいのですが、構成可能な要素をまとめる方法がわかりません。(または、私がしたいかどうか。)

もっと簡単な方法はありますか?登録段階で本当に解決すべきではないことを知っているので、私は通常は素晴らしいアイデアであるとは思っていません。しかし、インストールは複雑で、ログを少し記録する必要があると思います。

他の誰かが以前にこの種のことをしたことがありますか? どんな助け(またはより正しい道への舵取り!)も大歓迎です。

4

1 に答える 1

1

ロガー ファクトリの登録がインストーラーの完了後にのみ発生するという問題が実際にある場合は、次のことを試すことができます。

2 つの構成セクションの城 1 城 2 を作成します。

<castle1>        
    <facilities>
        <facility id="logging"
            type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" />
    </facilities>
</castle1>

<castle2>        
    <installers>
        <install type="MyProject.LoggerInstaller,MyProject" />
    </installers>
</castle2>

2 つのステップでコンテナーを初期化します。

container.Install(new ConfigurationInstaller(new XmlInterpreter(new ConfigResource("castle1"))));
container.Install(new ConfigurationInstaller(new XmlInterpreter(new ConfigResource("castle2"))));

また、configfile の先頭で、castle1 および Castle2 セクションを指定する必要があります。

試したことはありませんが、試す価値はあると思います。

敬具、マルウェイン

于 2013-05-17T15:13:19.453 に答える