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);
}
이 로깅 방식은 사용이 간단하지만 로그레벨을 부여할수 없는것이 단점이다.