2012-01-01 2 views
14

많은 iOS 개발자가 NSLog 문구가 필요없는 것을 채우기 위해 Cocoa Lumberjack Logging framework을 발견했습니다. Java 세계에서 Log4J를 연상케합니다.코코아 로그 umber 로깅 프레임 워크 (NSLog가 콘솔로 플러시하는 방법)를 사용하여 로그 문을 즉시 내 보냅니다.

Lumberjack 용 사용자 정의 포맷터를 작성했지만 로그 설명서를 즉시 플러시하는 방법에 대한 문서는 볼 수 없습니다.

예를 들어, 디버거를 거치면서 NSLog() 문을 누르면 콘솔에 로그 문이 즉시 플러시됩니다. 그것은 Lumberjack에서 DDLogVerbose() 전화를 걸고 싶습니다.

바로 지금 코드 세그먼트를 디버깅 할 때 즉시 문을 두드리면 문을 NSLog() 문으로 변경합니다. Lumberjack이 매우 강력 해짐에 따라 지연없이 플러시하도록 구성하는 방법이 있다고 생각합니다.

누구나 그렇게하는 법을 알고 있습니까?

답변

27

DDLog.h 파일의 답변을 찾았습니다. Lumberjack에는 비동기식 및 동기식 로깅이라는 개념이 있습니다. 처음 읽으면서, 그것이 무엇을 위해 있었는지에 관해 나를 치지 않았다.

기본적으로 로그 명령문을 순서대로 출력하려면 동기화를 수행해야합니다 (단, 마이크가 언급했듯이 성능이 저하됩니다). 따라서 디버깅 상황에서만이 작업을 수행해야합니다. 이상적으로, 나는 다른 헤더와/또는 다른 전 처리기 매크로를 넣어 스위치가 동기식으로 뒤집 히지 않도록해야한다.

  1. 열기까지 DDLog.h
  2. 이동 #define LOG_ASYNC_ENABLED YES와 라인 :

    다음은 무엇입니다. 이 항목을 한 지점에서 NO으로 변경하여 동기식 로깅을 수행하거나 다음 단계에서 개별 레벨을 변경할 수 있습니다.

헤더가 DDLog.h 파일 자체를 변경하는 것을 방지합니다. 따라서 Lumberjack 위키 페이지 link의 지침에 따라 다른 헤더 파일을 사용하여 이러한 재정의 사용자 정의를 명확하게 설명하는 방법을 설명합니다.

#import "DDLog.h" 
#import "DDASLLogger.h" 
#import "DDTTYLogger.h" 

// ========================= Overrides ======================================== 
// --> per https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels 
// ---------------------------------------------------------------------------- 

// Are we in an optimized (i.e. Release) build? 
#ifdef __OPTIMIZE__ 
    // YES: Nothing to do from the default. (You could simplify this by using #ifndef above instead) 
#else 
    // NO: We're in a Debug build. As such, let's configure logging to flush right away. 
    // Undefine the asynchronous defaults: 
    #undef LOG_ASYNC_VERBOSE 
    #undef LOG_ASYNC_INFO 
    #undef LOG_ASYNC_WARN 

    // Define the logs levels to be synchronous: 
    #define LOG_ASYNC_VERBOSE (NO && LOG_ASYNC_ENABLED) // Debug logging will be synchronous 
    #define LOG_ASYNC_INFO  (NO && LOG_ASYNC_ENABLED) // Info logging will be synchronous 
    #define LOG_ASYNC_WARN  (NO && LOG_ASYNC_ENABLED) // Warn logging will be synchronous 
#endif 
0

을 DDTTYLogger.m의 - (void)logMessage:(DDLogMessage *)logMessage 기능에있는 if (logMsg) 하단에 추가 할 수 있습니다.

모든 로그 메시지에서 플래시 오류가 발생하면 성능에 치명적인 영향을 미칠 수 있습니다. 즉, 디버깅에 사용하면 성능에 문제가 발생할 수 있습니다.

+0

감사합니다. Mike. 이것은 합리적인 가정이었다. 불행하게도 작동하지 않았습니다. stdout 플러시도 시도했지만, 그 중 하나가 작동하지 않았다 (어떤 의미가 - 전체 방법 stderr 출력을 구축하는 것 같다). – idStar

1

당신은 완료 로깅 큐 기다릴 수 : 그 사용

, 여기에 내가 성공적으로 내 응용 프로그램의 미리 컴파일 된 헤더에 가져 "MyAppLumberjack.h"헤더 파일로, 작성 및 테스트 한 것입니다 시간 초과 :

- (void)waitForLog { 
    dispatch_semaphore_t sema = dispatch_semaphore_create(0); 
    dispatch_async(DDLog.loggingQueue, ^{ 
    dispatch_semaphore_signal(sema); 
    }); 
    dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC))); 
}