iOS2013. 6. 12. 10:37


Google Tool Box for Mac에서 제공하는 _GTMDebugLog

log4j를 cocoa에 포팅한 log4cocoa 정도가 있겠다.


먼저 GTM의 logging방식을 살펴보겠다.


GTM for Mac은 구글개발자들이 사용하는 맥개발용 라이브러리들을 모아놓은 프로젝트이다.

이 중에 로그를 위해 만들어 놓은게 _GTMDevLog, _GTMDevAssert인데 기능자체는 상당히 간단하다.

GTMDefines.h에 다음과 같이 정의되어 있다.

#ifndef _GTMDevLog

#ifdef DEBUG

  #define _GTMDevLog(...) NSLog(__VA_ARGS__)

#else

  #define _GTMDevLog(...) do { } while (0)

#endif

#endif // _GTMDevLog

#ifndef _GTMDevAssert

// we directly invoke the NSAssert handler so we can pass on the varargs

// (NSAssert doesn't have a macro we can use that takes varargs)

#if !defined(NS_BLOCK_ASSERTIONS)

  #define _GTMDevAssert(condition, ...)                                       \

    do {                                                                      \

      if (!(condition)) {                                                     \

        [[NSAssertionHandler currentHandler]                                  \

            handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \

                               file:[NSString stringWithUTF8String:__FILE__]  \

                         lineNumber:__LINE__                                  \

                        description:__VA_ARGS__];                             \

      }                                                                       \

    } while(0)

#else // !defined(NS_BLOCK_ASSERTIONS)

  #define _GTMDevAssert(condition, ...) do { } while (0)

#endif // !defined(NS_BLOCK_ASSERTIONS)

#endif // _GTMDevAssert


NSLog와 NSAssertionHandler를 연결해 두었고 DEBUG빌드시에만 실제 로거가 동작하도록 되어 있다.

다만 _GTMDevLog를 실제 프로젝트에서 리플랙션을 통해 동작방식을 정의할 수 있도록 샘플이 있다.


GTM_Prefix.pch에 다음과 같이 변경하여 오버라이딩이 가능하다.

// This turns on unit test logging so that we can track unittests if we are

// doing them. See GTMUnitTestDevLog.h for details.

// (_GTMUnitTestDevLog comes from GTMDevLogUnitTestingBridge.m)

#define _GTMDevLog _GTMUnitTestDevLog


별도의 브릿지역할을 하는 GTMDevLogUnitTestingBridge.m에 다음과 같이 정의되어 있는데 GTMUnitTestDevLog라는 클래스명으로 리플렉션하여 로그동작을 오버라이드 하고 있다.

void _GTMUnitTestDevLog(NSString *format, ...) {

  Class devLogClass = NSClassFromString(@"GTMUnitTestDevLog");

  va_list argList;

  va_start(argList, format);

  if (devLogClass) {

    [devLogClass log:format args:argList];

  } else {

    NSLogv(format, argList); // COV_NF_LINE the class is in all our unittest setups

  }

  va_end(argList);

}

이 로깅 방식은 사용이 간단하지만 로그레벨을 부여할수 없는것이 단점이다.






Posted by 삼스