2012-02-28 9 views
1

私はウィンザーロギングファシリティをNLogのラッパーとして実験しています。 callsite情報が実際の呼び出し元情報の代わりにラッパークラスとメソッド名を発行している以外はすべて正常に動作しているようです。基本的な検索から、これは明白なもののように聞こえましたが、私はこれに対する解決策を見つけることができませんでした。何かご意見は?城ウィンザーロギング施設NLog - コールサイト情報

私はコンテナに施設を追加しました:私のクラスで

container.AddFacility<LoggingFacility>(f => f.UseNLog()); 

を、私は公共の財産を持っていると私はコンテナを使用してクラスをインスタンス化しています。

private ILogger logger = NullLogger.Instance; 
    public ILogger Logger 
    { 
     get 
     { 
      return logger; 
     } 
     set 
     { 
      logger = value; 
     } 
    } 

そして、私のNLog.configは、呼び出し場所情報を放出するように構成されています

 ${callsite: className=true: fileName=true: includeSourcePath=true: methodName=true} 

答えて

1

それはNLog Loggerオブジェクトは、呼び出しサイトの情報は実装されていないラップ城NLogLoggerラッパーのように私には見えます保持される。ラッパーの実装については、this link into the Castle repositoryを参照してください。完全を期すため

、ここで城の実装の簡略例である:

public class NLogLogger : ILogger 
{ 
    public NLogLogger(Logger logger, NLogFactory factory) 
    { 
    Logger = logger; 
    Factory = factory; 
    } 

    internal NLogLogger() {} 

    public bool IsDebugEnabled 
    { 
    get { return Logger.IsDebugEnabled; } 
    } 
    public void Debug(string message) 
    { 
    Logger.Debug(message); 
    } 
} 

重要な問題は、「デバッグ」方法(ロギング方法のすべての残りの部分)がNLogに対応するメソッドを使用することですLoggerオブジェクト。 NLog Loggerのロギングメソッドは、コール関数/メソッドをコールサイトとして使用します(これは100%正確ではありませんが、事実上この場合に起こります)。したがって、このラッパーの場合、コールサイトはCastle NLogラッパーの実装になります。コールサイトが保存されるようにラッパーを記述する正しい方法の1つは、NLog LoggerでLogメソッドを使用し、ラッパーのTypeを最初のパラメーターとして渡すことです。 NLogはMethodInfoのTypeがLogメソッドに渡されたTypeと同じになるまでスタックに上がります。スタックの次のメソッドはコールサイトです。

正しく呼び出しサイトの情報を保持するために、デバッグ方法は、次のようになります。

public void Debug(string message) 
{ 
    LogEventInfo logEvent = new LogEventInfo(LogLevel.Debug, Logger.Name, message); 
    Logger.Log(typeof(NLogLogger), logEvent); 
} 

は私が正しくNLogのロガーように呼び出しをラップについては、過去に投稿した答えにこれらのリンクを参照してください。サイト情報は保持されます。

How to retain callsite information when wrapping NLog

Nlog Callsite is wrong when wrapper is used

NLogのLoggerを拡張する方法の例については、NLogのソースリポジトリにthis linkも参照してください。

+0

ありがとうございます。それは明らかに問題を説明している。 – user1178376

+0

ありがとう、私はちょうど上記のように変更したコアソリューションをクローンし、それは魅力的なように働いた。 Castle.Services.Logging.NLogIntegration.dllを作成し、既存のアセンブリをNuGetパッケージ(Castle.Core NLog Integration 3.0)から上書きするだけでよいことに注意してください。 –

+0

うれしい私は助けることができました! – wageoghe