5

私の目標は、複数のプロジェクトで共有できる log4net ライブラリを作成することです。

.net 4.0 にある私のソリューションでは、Logger というクラス ライブラリを作成し、Web プロジェクトから参照しました。

ここで、クラス ライブラリに logger.config を作成し、すべての構成を logger.config ファイルに入れました。私はそれから使用しました

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

Web アプリを実行すると、何もログに記録されません。だから私はweb.configにこのコード行を追加しました

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

デバッグ情報とエラー情報が表示されました

アプリケーションの .config ファイルで構成セクション 'log4net' が見つかりませんでした。および 要素の .config ファイルを確認します。構成セクションは次のようになります。

構成を logger.config から web.config に移動しましたが、すべて正常に動作しているようです。

web.config に log4net 構成は必要ありませんが、よりクリーンなアプローチとして logger.config を使用します。目標は、他のプロジェクトでこのライブラリを使用し、すべてのプロジェクトで構成について心配する必要がないようにすることです。

ここで問題は、これを行うにはどうすればよいかということです。私は何を間違っていますか?コード例を含む提案は、誰にとっても有益です。

参考までに、構造マップ IOC を使用して、ログに記録する前にロガーを再愛用しています。

4

3 に答える 3

9

あなたは車輪の再発明を試みていると思います。コードからロガーフレームワークを切り離してコードからロガーを抽象化するためのツールがいくつかあります。

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>

より多くのアペンダーを構成するには:ここをクリックしてください

プロジェクトでは、ロガー抽象化コンポーネントへの参照のみが必要です。Webプロジェクト(またはWindowsアプリケーション、同じ)で、log4net構成ファイルとそれらのアプリケーション設定のみを追加します。

再利用可能なコンポーネントを作成しているので、組織内に内部Nugetサーバー(単なるIISアプリケーション)をセットアップし、それを使用してコンポーネント(この場合はロガーを含むライブラリ)を展開することをお勧めします。また、アプリケーション設定とlog4net構成ファイルのみを含む別のNugetパッケージを作成して、このNugetパッケージをWebプロジェクトにのみインストールできるようにするとよいでしょう。

于 2012-06-10T00:42:09.160 に答える
3

Web アプリケーションの場合は、application_start (global.asax.cs) に構成ファイルを読み込んでみてください。

    void Application_Start(object sender, EventArgs e)
    {
        log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("Logger.config")));
    }
于 2012-06-09T10:27:59.083 に答える
2

http://forums.asp.net/t/1739162.aspx/1またはこれを試してみてください。Web アプリケーションは、デフォルトで、メインの webconfig と、area/folder からの構成のみを参照します。以下のように、必要なすべての構成を new appConfigforに必ず含めて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>

psもこの回答をチェックしてください:web.configは外部xmlファイルから読み取ることができますか? web.config に含まれていない場合は、構成ファイルもデプロイしてください。

于 2012-06-07T04:36:27.353 に答える