使用 PostSharp 记录参数和 return 集合

Logging parameter and return Collections using PostSharp

我想使用 Log PostSharp 方面以便轻松记录我的异步 Web API 端点的所有进入和退出值。

例如:

[Log]
[HttpGet]
public async Task<List<string>> Get(List<int> ids)
{
    var result = await GetResult(ids);
    return result;
}

结果是:

DEBUG Controllers.MyController - Entering: MyController.Get(this = {Controllers.MyController}) : 
                                         {System.Collections.Generic.List`1[System.String]}

DEBUG Controllers.MyController - Leaving: MyController.Get(this = {Controllers.MyController}) : 
         {System.Threading.Tasks.Task`1[System.Collections.Generic.List`1[System.String]]}

而不是实际值。我怎样才能做到这一点?

Log 方面不支持 PostSharp 4.3 和旧版本中的异步方法。您可以轻松开发自己的自定义日志记录方面:

[PSerializable]
public sealed class CustomLog : OnMethodBoundaryAspect
{
    public CustomLog()
    {
        ApplyToStateMachine = true;
    }

    public override void OnSuccess(MethodExecutionArgs args)
    {
        var stringBuilder = new StringBuilder();
        var declaringType = args.Method.DeclaringType;

        stringBuilder.Append("Exiting ");
        stringBuilder.Append(declaringType.FullName);
        stringBuilder.Append('.');
        stringBuilder.Append(args.Method.Name);

        if (!args.Method.IsConstructor && ((MethodInfo) args.Method).ReturnType != typeof(void))
        {
            stringBuilder.Append(" with return value ");
            stringBuilder.Append(args.ReturnValue);
        }

        Logger.WriteLine(stringBuilder.ToString());
    }
}

重要的是在构造函数中:ApplyToStateMachine = true 指示 PostSharp 将方面正确应用到状态机(异步方法和枚举器)。如果没有 ApplyToStateMachine = true,CustomLog 的行为方式将与标准 Log 方面相同。

此示例不适用于泛型方法和类型,不适用于更复杂的参数和 return 类型,并且还有许多其他限制。 您可以在此 PostSharp 示例中找到更完整的解决方案:CustomLogging。不幸的是,该示例不包含有关 ApplyToStateMachine = true.

的任何信息

编辑 2016 年 11 月 4 日: 此示例在 PostSharp 5.0.10 中工作,即使对于异步方法也是如此。 args.ReturnValue 包含异步方法的 return 值。