【问题标题】:How do I use PostSharp to do call stack aggregated logging?如何使用 PostSharp 进行调用堆栈聚合日志记录?
【发布时间】:2016-04-05 19:43:53
【问题描述】:

我目前正在使用 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() 应该会产生与上述类似的结果。

【问题讨论】:

    标签: logging profiling aggregate aop postsharp


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 2016-06-05
      • 2014-04-13
      • 1970-01-01
      相关资源
      最近更新 更多