2016-04-05 1 views
0

Ich verwende derzeit PostSharp, um die AOP-Leistungsprotokollierung durchzuführen, und ich möchte einige zusammengefasste Varianten für ProfilerAspects erstellen.Wie verwende ich PostSharp, um die aggregierte Protokollierung des Aufruf-Stacks durchzuführen?

Eine Variante, die mich interessiert, ist das Aggregieren der Protokollierung durch die erste Funktion, die mit diesem Aspekt aufgerufen wird. Hoffentlich wird dieses Beispiel sollte deutlich machen: Ich möchte einen Aspekt haben genannt EntryAggregatedProfiler und zwei Methoden A und B wie folgt:

[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); 
} 

Ich würde mein Profiler Aspekt möchte einen Eintrag erstellen, wenn A (0) wird genannt. Der Protokolleintrag für A (0) der folgenden Form sein sollte:

<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> 

und ein Aufruf von B() sollte wie

<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> 

Zum einen Protokolleintrag erstellen, würde Ich mag auch habe dies auf der Ebene der Klassen erstellt, so dass die gleichen Entwurfsmuster wie oben, aber mit A und B als Methoden innerhalb einer Klasse:

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

so ein Aufruf an CA (0) und CB() sollen ähnlich produzieren Ergebnisse zu oben.

Antwort

0

Sie können sich an Beispielen unter http://samples.postsharp.net/ inspirieren lassen.

Es gibt ein Beispiel für die Protokollierung, das auch eine Einrückung enthält, die den Aufrufstapel widerspiegelt. Es gibt auch ein anderes Beispiel zum Profiling.

Der Aspekt (Protokollierung oder Profilerstellung), der die OnMethodBoundaryAspect Klasse erweitert, kann auf eine bestimmte Methode, Klasse oder mehrere Klassen/Methoden gleichzeitig angewendet werden. Sie brauchen also keinen speziellen Aspekt, der auf alle Methoden einer Klasse angewendet werden kann.

Verwandte Themen