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.