2016-10-08 1 views
0

로그 비헤이비어를 사용하여 내 비동기 웹 API 끝점의 모든 항목과 종료 값을 쉽게 기록 할 수 있습니다. 예를 들어로깅 매개 변수 및 반환 PostSharp를 사용하는 컬렉션

:

[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]]} 

. 내가 어떻게 이걸 얻을 수 있니?

답변

3

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과 동일한 방식으로 작동합니다.

이 예제는 제네릭 메서드 및 형식에서는 작동하지 않지만보다 복잡한 인수 및 반환 형식에서는 작동하지 않으며 기타 많은 제한 사항이 있습니다. 이 PostSharp 샘플에서보다 완벽한 해결책을 찾을 수 있습니다 : CustomLogging. 불행하게도이 예에는 ApplyToStateMachine = true에 대한 정보가 없습니다.

EDIT 11/04/2016 : 이 예제는 비동기 메서드의 경우에도 PostSharp 5.0.10에서 작동합니다. args.ReturnValue에는 async 메서드의 반환 값이 포함되어 있습니다.

+0

'args.ReturnValue'가 null입니다. 왜 그런가? – Nicholas

+0

OnMethodBoundaryAspect의 버그 또는 이상한 제한 사항처럼 보입니다. 나는 그것을 해결하는 방법에 대한 예제를 추가했지만 그것은 이상적인 것과 거리가 멀다. –

+0

아직도 작동하지 않습니다 : ( – Nicholas