使用 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 值。
我想使用 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 值。