2017-08-24 9 views
1

NLogでMDLCの利点を最大限に活用するには、ログでデバッグするときに後で識別する必要があるすべてのオブジェクトのinitメソッドでMDLCパラメータを設定しようとしています。NLog異なるロガーのレイアウト

たとえば、あるFoo()メソッドを持つAクラスがあります。logger.Debug('Foo method started')のようなものがあります。あるオブジェクトがFoo()メソッドasyncを実行しているので、私はこのタスクのためにいくつかのMDLCパラメータを持っています。例えば、MappedDiagnosticsLogicalContext.Set("A_Id", this.id);です。

Bクラスがあり、Bar()メソッドがあり、logger.Debug('Bar method started')を記録します。また、Bオブジェクトを特定するか、ログ呼び出しごとに同じパラメータを必要とするだけで、MappedDiagnosticsLogicalContext.Set("B_Id", this.id);があります。

<Logger/>にはLayoutの固有性がありません。 <Target/>にのみあります。 だから私はロガークラスに基づいて、このMDLC paramsはを含めるための3つの方法を参照してください。複数のターゲット(各ロガーの1)と同じでを持つために

<variable name="optional" value="${aParams}${when:when=equals('${logger}','App.B'):inner=|${mdlc:item=B_id}}"/> 

<target layout="${optional}" 
fileName="logs.txt" 
name="f" 
xsi:type="File"/> 
  • when構造の連鎖

    1. をファイル名。本当に合法であるかどうかはわかりませんが、私が覚えているようにどこかでそれを見ました。

      <target layout="${mdlc:item=A_id}" 
          fileName="logs.txt" 
          name="f" 
          xsi:type="File"/> 
      
      <target layout="${mdlc:item=B_id}" 
          fileName="logs.txt" 
          name="f" 
          xsi:type="File"/> 
      
    2. AクラスのMappedDiagnosticsLogicalContext.Set("Param", this.id);.BクラスのMappedDiagnosticsLogicalContext.Set("Param", this.id);ようMDLCのPARAMを共有していると。

      <target layout="${mdlc:item=Param}" 
          fileName="logs.txt" 
          name="f" 
          xsi:type="File"/> 
      

    3つ目は実装するのが最も簡単に見えますが、これはpreferrableの方法である場合、私はどんな理由が辞書を持っているし、どこでも1つのキーだけを使用するように表示されません。だから、それを行うための簡単な方法があるのか​​、あるいはそれが好ましいのだろうか?

  • 答えて

    1

    オプション3は、NLogが条件をチェックせずに印刷できるので、パフォーマンスビューから最も速いです。また、設定が読みやすくなります。

    オプション2はサポートされていません。

    オプション1は柔軟性がありますが、少し遅くなります。

    注意:ここではMDLCが最良の選択であるかどうかはわかりません。私はイベントのプロパティもオプションだと思う。

    関連する問題