【问题标题】:Logging parameter and return Collections using PostSharp使用 PostSharp 记录参数和返回集合
【发布时间】:2016-10-08 02:11:54
【问题描述】:

我想使用 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]]}

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

【问题讨论】:

    标签: c# .net asp.net-web-api log4net postsharp


    【解决方案1】:

    Log aspect 不支持 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 方面的行为方式相同。

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

    编辑 2016 年 11 月 4 日: 此示例在 PostSharp 5.0.10 中也适用于异步方法。 args.ReturnValue 包含异步方法的返回值。

    【讨论】:

    • args.ReturnValue 为空。知道为什么吗?
    • 这似乎是 OnMethodBoundaryAspect 的一个错误或奇怪的限制。我添加了一个如何解决它的示例,但它远非理想。
    • 很高兴知道什么不起作用:)。但似乎限制已修复,第一个示例似乎在 PostSharp 5.0.10 中运行。
    • 对不起 :) “不工作”我的意思是 args.ReturnValue 始终为空。看来我可能需要等待 PS 5。
    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 2012-06-08
    • 2011-12-28
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多