2012-01-03 8 views
8

私はC#MVC3 WebアプリケーションのログにNLogを使用しています。すべてのコントローラは、常に必要なメソッドとメンバにアクセスできるカスタムベース "ApplicationController"を継承しています。NLogを使用してログを記録するためにC#クラスの派生クラスが必要

私はすべてのコントローラは、この基底クラスを経由してロガーへのアクセス権を持って好きですが、ログ・ステートメントが発祥のクラスを派生するものを知るの詳細をしたいと思います

当社のアプリケーションコントローラは次のようになります。

public abstract class ApplicationController : Controller 
{ 
    protected Logger _logger; 
    protected virtual Logger Logger 
    { 
     get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); } 
    } 

    protected ApplicationController() 
    { 
     Context = new Entities(); 
    } 

派生コントローラがLoggerをオーバーライドしない場合、すべてのステートメントはApplicationコントローラから発生したことを示します。現在、派生したすべてのコントローラーでは、基本的に同じLoggerステートメントを使用しています。例:

public class PropertyController : ApplicationController 
{ 
    private readonly DatatapeService _datatapeService; 
    private readonly PropertyService _propertyService; 
    protected override Logger Logger 
    { 
     get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); } 
    } 

これは明らかに実装が貧弱なことです。

  1. これをどのように乾かすことができますか?具体的には、私はC# の正確なこの特定のタスクを達成するために欠けていることを理解していますか?
  2. ロギングクラス(NLog)を直接公開していない場所で、次のようなロギングパターンがありますか?

TIA!

答えて

12

私はNLogには慣れていませんが、Log4Netでは構文 LogManager.GetLogger(this.GetType())が必要です。 GetTypeは、ロガーが最初に作成されたときに、ベースApplicationControllerクラスで呼び出された場合でも、あなたの継承階層に葉の種類を返します(例:ロガープロパティへの最初のアクセスに)それだけでnLogをチェックするタイプでPropertyController

+0

を期待しています

Logger = LogManager.GetLogger(GetType().Name); 

を使用する必要があります。NAME'はそれを行う必要があります。 –

+1

これはまさに私が行ったことです。私はthis.GetTypeが最も派生したクラスを返すことを認識しませんでした。これにより、私はApplicationControllerで単一のプロパティを作成し、そのアプリケーション全体でそのロガーを使用することができました。 –

+0

ダニのために助けてくれてありがとう:D –

0

それをインスタンス化しますウィキhere

ほとんどのケースでは、クラスごとに1つのロガーを持っていますので、現在のクラスとロガーに同じ名前を付けること 意味があります。

この

public abstract class ApplicationController : Controller 
{ 
    protected Logger _logger; 
    protected virtual Logger Logger(string className) 
    { 
     return LogManager.GetLogger(className); 
    } 
} 


public class PropertyController : ApplicationController 
{ 
    private readonly DatatapeService _datatapeService; 
    private readonly PropertyService _propertyService; 
    protected override Logger Logger() 
    { 
     return base.Logger("PropertyController "); 
    } 
} 
+6

私は本当にそのアプローチが嫌いです。私がそうするならば、私はすべてのコントローラにコードをコピーして貼り付けています。多くの重複を持つのは間違いだと感じています。 –

+0

@BobbyBスニペット、共通基本クラス?NLogは、ロガー構成にフライウェイトパターンを使用するため、オーバーヘッドは最小限に抑えられます。実際のロギングに起因する行は大部分が重複しています。 – Gusdor

3

NLogのAPIのようにそれを行うことは理にかなってlog4netのよりもわずかに異なっています。あなたは)私は `this.GetType(と思うあなただけのタイプを渡すと、LogManagerのは、ロガータイプ(すなわち、カスタムロガー)

+1

LogManager.GetLogger(GetType()。FullName)がより便利になることがわかりました –

+0

ありがとう@DavidHayes - あなたに同意します。だから、基本クラスのプロパティの 'GetCurrentClassLogger()'に相当するのは、 'get {return _logger ?? (_logger = LogManager.GetLogger(this.GetType()。FullName)); } ' – Beel

関連する問題