如何使用PostSharp进行调用堆栈聚合日志记录?

时间:2016-04-05 19:43:54

标签: logging profiling aggregate aop postsharp

我目前正在使用PostSharp进行AOP性能记录,并且我想在ProfilerAspects上做一些聚合变体。

我感兴趣的一个变体是通过使用该方面调用的第一个函数聚合日志记录。希望这个例子能说清楚:我想要一个名为EntryAggregatedProfiler的方面,以及两个方法A和B,如下所示:

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

我希望我的探查器方面在调用A(0)时创建一个条目。 A(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>

其次,我也希望在类级别创建它,所以设置模式与上面相同,但A和B都是类中的方法:

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

因此,对C.A(0)和C.B()的调用应产生与上述类似的结果。

1 个答案:

答案 0 :(得分:0)

您可以从http://samples.postsharp.net/的示例中获取灵感。

有一个关于日志记录的示例,其中还包括反映调用堆栈的缩进。还有另一个关于分析的例子。

扩展OnMethodBoundaryAspect类的方面(日志记录或分析)可以一次应用于特定方法,类或多个类/方法。因此,您不需要将特殊方面应用于类的所有方法。