2012-10-09 2 views
12

그것은 성가신 일입니다. MPMoviePlayerController를 사용하기 시작한 이래로 콘솔에 MPAVController의 정보가 너무 많이 채워집니다. 예는 :특정 개체에 대한 콘솔 로깅 기능을 해제하십시오.

[MPAVController] Autoplay: _streamLikelyToKeepUp: 1 -> 1 
[MPAVController] Autoplay: Disabling autoplay 

이 난 항상 내 자신의 기록 된 정보를 검색 할 필요가 성가신 때문에 어떤 종류의 것입니다. 특정 개체 또는 프레임 워크에 대한 로깅을 해제하는 방법이 있습니까?

답변

10

상자에서 필터링이 가능하다고 생각하지 않습니다. 그러나 stderr (NSLog으로 사용)을 파이프로 리디렉션하고 백그라운드 스레드에서 해당 파이프를 읽은 다음 필터를 통과하는 메시지를 stdout (디버거에서도 캡처 됨)에 인쇄 할 수 있습니다. 이 코드는 작업을 수행합니다.

int main(int argc, char *argv[]) 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^(void) { 
     size_t const BUFFER_SIZE = 2048; 

     // Create a pipe 
     int pipe_in_out[2]; 
     if (pipe(pipe_in_out) == -1) 
      return; 

     // Connect the 'in' end of the pipe to the stderr 
     if (dup2(pipe_in_out[1], STDERR_FILENO) == -1) 
      return; 

     char *buffer = malloc(BUFFER_SIZE); 
     if (buffer == 0) 
      return; 

     for (;;) 
     { 
      // Read from the 'out' end of the pipe 
      ssize_t bytes_read = read(pipe_in_out[0], buffer, BUFFER_SIZE); 
      if (bytes_read <= 0) 
       break; 

      // Filter and print to stdout 
      if (should_show(buffer)) // TODO: Apply filters here 
       fwrite(buffer, 1, bytes_read, stdout); 
     } 

     free(buffer); 
     close(pipe_in_out[1]); 
    }); 

    // Rest of main 
} 

이 코드는 매우 단순하며 모든 대소 문자를 처리하지 않습니다. 우선 stderr 출력을 캡처하며, 단지 NSLog이 아닙니다. 어쩌면이 내용을 검사하여 필터링 할 수 있습니다. NSLog 출력은 항상 날짜와 시간으로 시작됩니다.

이 코드의 두 번째 문제점은 파이프에서 읽는 문자열을 분할/결합하려고하지 않는다는 것입니다. 읽기 당 하나의 NSLog이 있다는 보장은 없습니다. 그들은 함께있을 수도 있고 너무 길어서 나뉠 수도 있습니다. 이를 처리하려면 파이프에서 읽은 데이터를 추가로 처리해야합니다.

어쨌든 많은 실제적인 목적으로 충분합니다.

3

NSLogger을 조사해야합니다. NSLog는 사용자가 실행 과정에서 볼 수있는 것에 대한 선택성을 제공하지는 않지만 NSLogger는 실행할 수 있습니다. NSLogger는 장치 (또는 시뮬레이터)의 출력을 OS X의 자체 창에 표시합니다.

기본적으로 출력에는 시설 및 레벨의 개념이 추가됩니다. 유닉스 마법사는이 비교에서 잘못을 발견 할 수 있지만 syslog와 매우 유사하다고 생각합니다. NSLogger 뷰어를 사용하면 필요한 최소 레벨을 충족하는 하나 이상의 기능 (정의)에 대한 출력 메시지를 표시 할 수 있습니다.

매크로는 출력 창에 표시되는 내용을 정의합니다.

#ifdef DEBUG 
    #define LOG_GENERAL(level, ...) LogMessageF(__FILE__,__LINE__,__FUNCTION__,@"general",level,__VA_ARGS__) 
#else 
    #define LOG_GENERAL(...) do{}while(0) 
#endif 

DEBUG가 꺼져 있으면 메시지가 표시되지 않습니다. 켜져 있으면 코드에 LOG_GENERAL() 문이 있고 뷰어가 "일반"기능을 표시하도록 구성되어 있고 레벨을 표시하기에 충분하면 메시지가 표시됩니다.

믿을 수 없을 정도로 융통성이 있으며 나는 그것을 아주 좋아합니다. 프로젝트에 추가하는 데 약 5 분이 소요됩니다. 자세한 내용은 위에 링크 된 github 페이지를 살펴보고 다운로드하십시오.

(이것은 메시지로 콘솔을 채우는 MPAVController 문제를 해결하지 않지만 원하는 메시지를 새 창에 표시하여 관심있는 내용을 훨씬 쉽게 제어, 필터링 및 해석 할 수 있습니다.)

+0

감사합니다. 앞으로도 유용 할 수 있습니다. –

0

다른 옵션을 사용하려면 시뮬레이터 또는 iOS < 6.0을 실행하는 장치를 실행하는 것입니다.

5.0 장치 나 5.1 시뮬레이터를 사용할 때 MPAVController 로그 메시지가 나타나지 않습니다. 그러나 그들은 분명히 6.0 시뮬레이터에 나타납니다.

물론 일반적으로 현재 OS를 사용해야하지만 프로젝트의 비디오 무거운 부분에서 작업하는 경우 특정 작업 세트에서 작업하는 동안 이전 시뮬레이터 나 장치를 실행하는 것이 이러한 로깅 두통을 완화하는 방법입니다 .

이것은 또한 일부 역 호환성 테스트를 보너스로 제공합니다.

관련 문제