1

Log4Net を使用してアプリケーションにロギングを追加しようとしています。

このフレームワークの目的とその仕組みを完全に誤解している可能性がありますが、私がやりたいのは、log4net インスタンスを実際にスピンアップし、(ここに問題があります) を使用するカスタム ファサード クラスを用意することですデフォルトでは単一の構成ファイルであり、必要に応じてクラスを使用してアプリケーションでオーバーライドできます。

そこで、カスタム Log4NetLogger クラスとそのインターフェイスを作成しました。

public class Log4NetLogger : ILogging
{
     private ILog _logger;

     public Log4NetLogger()
     {
         log4net.Config.XmlConfigurator.Configure();
        _logger = LogManager.GetLogger(this.GetType());
        string meh = string.Empty;
     }

    //interface methods for error, warn, info etc
 }

Log4NetLogger クラスを含むプロジェクトの AssemblyInfo.cs に、以下を追加しました。

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

プロジェクトに、次のような Log4Net.config ファイルを追加しました。

<log4net>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
<!-- various gubbins -->
<root>
  <level value="ALL" />
  <appender-ref ref="AdoNetAppender" />
</root>
</log4net>

また、コンパイル時に「常にコピー」に設定されているため、それを参照するプロジェクトの bin フォルダーにそのコピーが存在する必要があります。

さて、テスト クラスで、このプロジェクトへの参照を追加し、これを実行しました。

        Log4NetLogger logger = new Log4NetLogger();
        logger.Info("started");

これは絶対に何もしません。

デバッガーでコードをステップ実行すると、Log4Net が構成ファイルを取得していないことが明らかになります。ログ マネージャから返されたロガーでは、すべてのレベルが無効になっています。

ただし、テスト プロジェクトの web.config に同じ構成セクションを追加すると、機能します。しかし、ソリューション内のすべての構成ファイルに、膨大な量の同一のアペンダー構成を追加する必要はありません。

私は何を間違っていますか、私のアプローチに何か問題がありますか、そして最善の方法は何ですか?

乾杯、マット

4

2 に答える 2

2

AssemblyInfo.cs属性エントリを削除し、コンストラクタを変更してファイル名を渡す ことができるはずです。

public Log4NetLogger()
{
    log4net.Config.XmlConfigurator.ConfigureAndWatch(
       new System.IO.FileInfo("Log4Net.config"));      

    _logger = LogManager.GetLogger(this.GetType());
    string meh = string.Empty;
 }
于 2013-06-19T21:08:57.933 に答える
0

ログを保存する場所を構成するアペンダー セクションが必要です。このリンクも参照できますLog4netはログファイルを書き込みません

于 2013-06-19T14:13:53.253 に答える