More advanced mpw-internal logging mechanism.
Logging now happens at the mpw-core level, by default using sinks that can be registered. For iOS we forward log messages to os_log for unified logging. We also keep a record of log messages for future retrieval in a log view. This obsoletes and removes Pearl's logger entirely.
This commit is contained in:
		@@ -16,63 +16,60 @@
 | 
			
		||||
// LICENSE file.  Alternatively, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
//==============================================================================
 | 
			
		||||
 | 
			
		||||
#import <Availability.h>
 | 
			
		||||
#import "Pearl-Prefix.pch"
 | 
			
		||||
#define MP_LIBS_BEGIN \
 | 
			
		||||
_Pragma("clang diagnostic push") \
 | 
			
		||||
_Pragma("clang diagnostic ignored \"-Weverything\"")
 | 
			
		||||
#define MP_LIBS_END \
 | 
			
		||||
_Pragma("clang diagnostic pop")
 | 
			
		||||
 | 
			
		||||
MP_LIBS_BEGIN
 | 
			
		||||
#include <Availability.h>
 | 
			
		||||
#include <os/log.h>
 | 
			
		||||
#include <libgen.h>
 | 
			
		||||
MP_LIBS_END
 | 
			
		||||
 | 
			
		||||
#define mpw_log_os(level, file, line, function, format, ...) \
 | 
			
		||||
    do { \
 | 
			
		||||
        if (mpw_verbosity < level) { \
 | 
			
		||||
            break; \
 | 
			
		||||
        } \
 | 
			
		||||
        \
 | 
			
		||||
        switch (level) { \
 | 
			
		||||
            case LogLevelTrace: \
 | 
			
		||||
                os_log_debug( OS_LOG_DEFAULT, "%30s:%-3ld TRC | " format, basename( (char *)file ), line, ##__VA_ARGS__ ); \
 | 
			
		||||
                break; \
 | 
			
		||||
            case LogLevelDebug: \
 | 
			
		||||
                os_log_debug( OS_LOG_DEFAULT, "%30s:%-3ld DBG | " format, basename( (char *)file ), line, ##__VA_ARGS__ ); \
 | 
			
		||||
                break; \
 | 
			
		||||
            case LogLevelInfo: \
 | 
			
		||||
                os_log_info( OS_LOG_DEFAULT, "%30s:%-3ld INF | " format, basename( (char *)file ), line, ##__VA_ARGS__ ); \
 | 
			
		||||
                break; \
 | 
			
		||||
            case LogLevelWarning: \
 | 
			
		||||
                os_log( OS_LOG_DEFAULT, "%30s:%-3ld WRN | " format, basename( (char *)file ), line, ##__VA_ARGS__ ); \
 | 
			
		||||
                break; \
 | 
			
		||||
            case LogLevelError: \
 | 
			
		||||
                os_log_error( OS_LOG_DEFAULT, "%30s:%-3ld ERR | " format, basename( (char *)file ), line, ##__VA_ARGS__ ); \
 | 
			
		||||
                break; \
 | 
			
		||||
            case LogLevelFatal: \
 | 
			
		||||
                os_log_fault( OS_LOG_DEFAULT, "%30s:%-3ld FTL | " format, basename( (char *)file ), line, ##__VA_ARGS__ ); \
 | 
			
		||||
                break; \
 | 
			
		||||
        } \
 | 
			
		||||
        \
 | 
			
		||||
        mpw_log_sink( level, file, line, function, format, ##__VA_ARGS__ ); \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
#define MPW_LOG mpw_log_os
 | 
			
		||||
 | 
			
		||||
#include "mpw-util.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __OBJC__
 | 
			
		||||
 | 
			
		||||
#import "Pearl-Prefix.pch"
 | 
			
		||||
 | 
			
		||||
#if TARGET_OS_IOS
 | 
			
		||||
#import <UIKit/UIKit.h>
 | 
			
		||||
#elif TARGET_OS_OSX
 | 
			
		||||
#import <Cocoa/Cocoa.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#import <CoreData/CoreData.h>
 | 
			
		||||
#ifdef CRASHLYTICS
 | 
			
		||||
#import <Crashlytics/Crashlytics.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TARGET_OS_IOS
 | 
			
		||||
#import "MPTypes.h"
 | 
			
		||||
#import "MPiOSConfig.h"
 | 
			
		||||
#elif TARGET_OS_OSX
 | 
			
		||||
#import "MPTypes.h"
 | 
			
		||||
#import "MPMacConfig.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#import <libgen.h>
 | 
			
		||||
#import <CoreFoundation/CFString.h>
 | 
			
		||||
#import <objc/runtime.h>
 | 
			
		||||
#import <objc/message.h>
 | 
			
		||||
#import <objc/NSObjCRuntime.h>
 | 
			
		||||
#import <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#define mpw_log(level, format, ...) \
 | 
			
		||||
    do { \
 | 
			
		||||
        char *_msg = NULL; \
 | 
			
		||||
        asprintf( &_msg, format, ##__VA_ARGS__ ); \
 | 
			
		||||
        if (_msg) { \
 | 
			
		||||
            CFStringRef fileStr = CFStringCreateWithCString( NULL, basename( (char *)__FILE__ ), kCFStringEncodingUTF8 ); \
 | 
			
		||||
            CFStringRef funcStr = CFStringCreateWithCString( NULL, __FUNCTION__, kCFStringEncodingUTF8 ); \
 | 
			
		||||
            CFStringRef msgStr = CFStringCreateWithCString( NULL, _msg, kCFStringEncodingUTF8 ); \
 | 
			
		||||
            id (*_getLogger)(id, SEL) = (void *)objc_msgSend; \
 | 
			
		||||
            void (*_sendMsg)(id, SEL, CFStringRef, NSInteger, CFStringRef, NSUInteger, CFStringRef) = (void *)objc_msgSend; \
 | 
			
		||||
            _sendMsg( _getLogger( (id)objc_getClass( "PearlLogger" ), sel_getUid( "get" ) ), \
 | 
			
		||||
                    sel_getUid( "inFile:atLine:fromFunction:withLevel:text:" ), fileStr, __LINE__, funcStr, level, msgStr ); \
 | 
			
		||||
            if (fileStr) { CFRelease( fileStr ); } \
 | 
			
		||||
            if (funcStr) { CFRelease( funcStr ); } \
 | 
			
		||||
            if (msgStr) { CFRelease( msgStr ); } \
 | 
			
		||||
            free(_msg); \
 | 
			
		||||
        } \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
#define trc(format, ...) mpw_log( 0, format, ##__VA_ARGS__ );
 | 
			
		||||
#define dbg(format, ...) mpw_log( 1, format, ##__VA_ARGS__ );
 | 
			
		||||
#define inf(format, ...) mpw_log( 2, format, ##__VA_ARGS__ );
 | 
			
		||||
#define wrn(format, ...) mpw_log( 3, format, ##__VA_ARGS__ );
 | 
			
		||||
#define err(format, ...) mpw_log( 4, format, ##__VA_ARGS__ );
 | 
			
		||||
#define ftl(format, ...) mpw_log( 5, format, ##__VA_ARGS__ );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user