2016-04-05 6 views
0

私は現在、PostSharpを使用してAOPパフォーマンスログを作成しています。ProfilerAspectsでいくつかの集約型を使用したいと思います。PostSharpを使用してコールスタック集約ロギングを行うにはどうすればよいですか?

私が興味を持っているのは、そのアスペクトで呼び出された最初の関数によるロギングの集計です。私はEntryAggregatedProfilerと呼ばれる側面を持っているしたいと思いますし、2つの方法AおよびB以下のように:うまくいけば、この例では、それを明確にする必要があります私は1つのエントリを作成するために私のプロファイラの側面を希望

[EntryAggregatedProfiler] 
public int A(int depth) 
{ 
    Thread.sleep(100); // sleep 100 milliseconds 
    if (depth > 0) return depth; 
    return A(depth + 1); 
} 

[EntryAggregatedProfiler] 
public int B() 
{ 
    Thread.sleep(50); 
    return A(0); 
} 

とき(0)が呼び出されます。 (0)次の形式でなければならないのログエントリ:

<function name="A"> 
    <args> 
     <depth type="int">0</depth> 
    </args> 
    <function name="A"> 
     <args> 
      <depth type="int">1</depth> 
     </args> 
     <callTime>105</callTime> 
    </function> 
    <callTime>210</callTime> 
</function> 

そしてB()の呼び出しが

<function name="B"> 
    <args /> 
    <function name="A"> 
     <args> 
      <depth type="int">0</depth> 
     </args> 
     <function name="A"> 
      <args> 
       <depth type="int">1</depth> 
      </args> 
      <callTime>105</callTime> 
     </function> 
     <callTime>210</callTime> 
    </function> 
    <callTime>265</callTime> 
</function> 

のような1つのログエントリを作成する必要があります第二に、私もしたいのですがこれは、クラスレベルで作成されているので、上記のように、しかし、AとBの両方を持つクラス内のメソッドと同じデザインパターンは:

[ClassEntryAggregatedLogger] 
public class C 
{ 
    public int A(int depth) 
    { 
.......etc...... 
} 

だからCAへの呼び出しは、(0)およびCB()同様の生成すべきです結果は上記になります。

答えて

0

例のインスピレーションはhttp://samples.postsharp.net/です。

ロギングに関する1つの例として、コールスタックを反映したインデントも含まれています。プロファイリングのもう一つの例もあります。

OnMethodBoundaryAspectクラスを拡張したアスペクト(ロギングまたはプロファイリング)は、一度に特定のメソッド、クラス、または複数のクラス/メソッドに適用できます。したがって、クラスのすべてのメソッドに適用する特別なアスペクトは必要ありません。

関連する問題