2016-11-18 4 views
1

HttpClient를 사용하는 대상을 만들어야합니다. HttpClient에는 동기 메소드가 포함되어 있지 않으며, 모두 Task 비동기 호출을 반환합니다. NLog 타겟에서 이것을 사용하는 가장 좋은 방법은 무엇입니까? API가 비동기식/인식을 기다리고있는 것처럼 보이지 않으므로 보시겠습니까?NLog 대상의 HttpClient

답변

1

아마도 다음과 같이 작동해야합니다.

public class CustomTarget : Target 
{ 

protected override async void Write(NLog.Common.AsyncLogEventInfo logEvent) 
{ 
    try 
    { 
      await WriteAsync(logEvent.LogEvent).ConfigureAwait(false); 
      logEvent.Continuation(null); 
    } 
    catch (Exception ex) 
    { 
      InternalLogger.Error(ex, "Failed to sent message"); 
      logEvent.Continuation(ex); 
    } 
} 

} 

또는이 PR의 코드 훔치기 : https://github.com/NLog/NLog/pull/2006

1

간단한 작업을 원하면 async-task에서 Wait()을 수행하면됩니다. 그런 다음 AsyncTargetWrapper를 사용하여 사용자 정의 타겟을 래핑하면됩니다. 그렇다면 너무 많은 활성 http 요청을하는 것에 대해 걱정할 필요가 없습니다.

그러나 NLog는 지연된 로그 쓰기 작업을 수행하는 대상에는 문제가 없습니다. 유일하게 필요한 계약은 LogEventInfo와 함께 제공되는 비동기 - 연속 작업이 지연된 로그 쓰기 작업이 마침내 완료된 후에 호출된다는 것입니다 (아마도 영감을 얻기 위해 NetworkTarget을 살펴볼 수 있습니다)

+0

어쩌면 그것은 대상에'Tasks'를 저장하는 옵션도 그리고'가 FlushAsync''에서 그들을 await'를? – Julian

+0

@Julian 작업 기반 비동기 메서드를 지원하기 위해 NLog를 업데이트 할 계획이 있습니까? – Dismissile

+0

@Dismissile NLog ver. 4.4.6은 https://github.com/NLog/NLog/blob/master/src/NLog/Targets/AsyncTaskTarget.cs를 포함합니다. –