From 98b6eef71eac368692ae249f056a75d89ed0350d Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Fri, 6 Jul 2018 09:37:23 -0700 Subject: Split GoogleUtilities from FirebaseCore (#1370) --- Firebase/Core/FIRLogger.m | 175 +++++++++------------------------------------- 1 file changed, 32 insertions(+), 143 deletions(-) (limited to 'Firebase/Core/FIRLogger.m') diff --git a/Firebase/Core/FIRLogger.m b/Firebase/Core/FIRLogger.m index 2784ae9..dbec728 100644 --- a/Firebase/Core/FIRLogger.m +++ b/Firebase/Core/FIRLogger.m @@ -14,16 +14,11 @@ #import "Private/FIRLogger.h" -#import "FIRLoggerLevel.h" -#import "Private/FIRVersion.h" -#import "third_party/FIRAppEnvironmentUtil.h" +#import +#import +#import -#include -#include -#include -#include -#include -#include +#import "Private/FIRVersion.h" FIRLoggerService kFIRLoggerABTesting = @"[Firebase/ABTesting]"; FIRLoggerService kFIRLoggerAdMob = @"[Firebase/AdMob]"; @@ -51,24 +46,11 @@ NSString *const kFIRLoggerForceSDTERRApplicationArgument = @"-FIRLoggerForceSTDE /// Key for the debug mode bit in NSUserDefaults. NSString *const kFIRPersistedDebugModeKey = @"/google/firebase/debug_mode"; -/// ASL client facility name used by FIRLogger. -const char *kFIRLoggerASLClientFacilityName = "com.firebase.app.logger"; - -/// Keys for the number of errors and warnings logged. -NSString *const kFIRLoggerErrorCountKey = @"/google/firebase/count_of_errors_logged"; -NSString *const kFIRLoggerWarningCountKey = @"/google/firebase/count_of_warnings_logged"; - -static dispatch_once_t sFIRLoggerOnceToken; - -static aslclient sFIRLoggerClient; - -static dispatch_queue_t sFIRClientQueue; - /// NSUserDefaults that should be used to store and read variables. If nil, `standardUserDefaults` /// will be used. static NSUserDefaults *sFIRLoggerUserDefaults; -static BOOL sFIRLoggerDebugMode; +static dispatch_once_t sFIRLoggerOnceToken; // The sFIRAnalyticsDebugMode flag is here to support the -FIRDebugEnabled/-FIRDebugDisabled // flags used by Analytics. Users who use those flags expect Analytics to log verbosely, @@ -76,8 +58,6 @@ static BOOL sFIRLoggerDebugMode; // that behavior. static BOOL sFIRAnalyticsDebugMode; -static FIRLoggerLevel sFIRLoggerMaximumLevel; - #ifdef DEBUG /// The regex pattern for the message code. static NSString *const kMessageCodePattern = @"^I-[A-Z]{3}[0-9]{6}$"; @@ -86,96 +66,53 @@ static NSRegularExpression *sMessageCodeRegex; void FIRLoggerInitializeASL() { dispatch_once(&sFIRLoggerOnceToken, ^{ - NSInteger majorOSVersion = [[FIRAppEnvironmentUtil systemVersion] integerValue]; - uint32_t aslOptions = ASL_OPT_STDERR; -#if TARGET_OS_SIMULATOR - // The iOS 11 simulator doesn't need the ASL_OPT_STDERR flag. - if (majorOSVersion >= 11) { - aslOptions = 0; - } -#else - // Devices running iOS 10 or higher don't need the ASL_OPT_STDERR flag. - if (majorOSVersion >= 10) { - aslOptions = 0; - } -#endif // TARGET_OS_SIMULATOR + // Register Firebase Version with GULLogger. + GULLoggerRegisterVersion(FIRVersionString); // Override the aslOptions to ASL_OPT_STDERR if the override argument is passed in. NSArray *arguments = [NSProcessInfo processInfo].arguments; - if ([arguments containsObject:kFIRLoggerForceSDTERRApplicationArgument]) { - aslOptions = ASL_OPT_STDERR; - } - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" // asl is deprecated - // Initialize the ASL client handle. - sFIRLoggerClient = asl_open(NULL, kFIRLoggerASLClientFacilityName, aslOptions); - - // Set the filter used by system/device log. Initialize in default mode. - asl_set_filter(sFIRLoggerClient, ASL_FILTER_MASK_UPTO(ASL_LEVEL_NOTICE)); - sFIRLoggerDebugMode = NO; - sFIRAnalyticsDebugMode = NO; - sFIRLoggerMaximumLevel = FIRLoggerLevelNotice; + BOOL overrideSTDERR = [arguments containsObject:kFIRLoggerForceSDTERRApplicationArgument]; // Use the standard NSUserDefaults if it hasn't been explicitly set. if (sFIRLoggerUserDefaults == nil) { sFIRLoggerUserDefaults = [NSUserDefaults standardUserDefaults]; } + BOOL forceDebugMode = NO; BOOL debugMode = [sFIRLoggerUserDefaults boolForKey:kFIRPersistedDebugModeKey]; if ([arguments containsObject:kFIRDisableDebugModeApplicationArgument]) { // Default mode [sFIRLoggerUserDefaults removeObjectForKey:kFIRPersistedDebugModeKey]; } else if ([arguments containsObject:kFIREnableDebugModeApplicationArgument] || debugMode) { // Debug mode [sFIRLoggerUserDefaults setBool:YES forKey:kFIRPersistedDebugModeKey]; - asl_set_filter(sFIRLoggerClient, ASL_FILTER_MASK_UPTO(ASL_LEVEL_DEBUG)); - sFIRLoggerDebugMode = YES; - } - - // We should disable debug mode if we are running from App Store. - if (sFIRLoggerDebugMode && [FIRAppEnvironmentUtil isFromAppStore]) { - sFIRLoggerDebugMode = NO; + forceDebugMode = YES; } - - sFIRClientQueue = dispatch_queue_create("FIRLoggingClientQueue", DISPATCH_QUEUE_SERIAL); - dispatch_set_target_queue(sFIRClientQueue, - dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)); - -#ifdef DEBUG - sMessageCodeRegex = - [NSRegularExpression regularExpressionWithPattern:kMessageCodePattern options:0 error:NULL]; -#endif + GULLoggerInitializeASL(overrideSTDERR, forceDebugMode); }); } -void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode) { - FIRLoggerInitializeASL(); - dispatch_async(sFIRClientQueue, ^{ - // We should not enable debug mode if we are running from App Store. - if (analyticsDebugMode && [FIRAppEnvironmentUtil isFromAppStore]) { - return; - } - sFIRAnalyticsDebugMode = analyticsDebugMode; - asl_set_filter(sFIRLoggerClient, ASL_FILTER_MASK_UPTO(ASL_LEVEL_DEBUG)); - }); +__attribute__((no_sanitize("thread"))) void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode) { + sFIRAnalyticsDebugMode = analyticsDebugMode; } void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel) { - if (loggerLevel < FIRLoggerLevelMin || loggerLevel > FIRLoggerLevelMax) { - FIRLogError(kFIRLoggerCore, @"I-COR000023", @"Invalid logger level, %ld", (long)loggerLevel); - return; - } FIRLoggerInitializeASL(); - // We should not raise the logger level if we are running from App Store. - if (loggerLevel >= FIRLoggerLevelNotice && [FIRAppEnvironmentUtil isFromAppStore]) { - return; - } + GULSetLoggerLevel((GULLoggerLevel)loggerLevel); +} - sFIRLoggerMaximumLevel = loggerLevel; - dispatch_async(sFIRClientQueue, ^{ - asl_set_filter(sFIRLoggerClient, ASL_FILTER_MASK_UPTO(loggerLevel)); - }); +#ifdef DEBUG +void FIRResetLogger() { + extern void GULResetLogger(void); + sFIRLoggerOnceToken = 0; + [sFIRLoggerUserDefaults removeObjectForKey:kFIRPersistedDebugModeKey]; + sFIRLoggerUserDefaults = nil; + GULResetLogger(); +} + +void FIRSetLoggerUserDefaults(NSUserDefaults *defaults) { + sFIRLoggerUserDefaults = defaults; } +#endif /** * Check if the level is high enough to be loggable. @@ -186,37 +123,11 @@ void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel) { __attribute__((no_sanitize("thread"))) BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent) { FIRLoggerInitializeASL(); - if (sFIRLoggerDebugMode) { - return YES; - } else if (sFIRAnalyticsDebugMode && analyticsComponent) { + if (sFIRAnalyticsDebugMode && analyticsComponent) { return YES; } - return (BOOL)(loggerLevel <= sFIRLoggerMaximumLevel); -} - -#ifdef DEBUG -void FIRResetLogger() { - sFIRLoggerOnceToken = 0; - [sFIRLoggerUserDefaults removeObjectForKey:kFIRPersistedDebugModeKey]; - sFIRLoggerUserDefaults = nil; -} - -void FIRSetLoggerUserDefaults(NSUserDefaults *defaults) { - sFIRLoggerUserDefaults = defaults; -} - -aslclient getFIRLoggerClient() { - return sFIRLoggerClient; -} - -dispatch_queue_t getFIRClientQueue() { - return sFIRClientQueue; -} - -BOOL getFIRLoggerDebugMode() { - return sFIRLoggerDebugMode; + return GULIsLoggableLevel((GULLoggerLevel)loggerLevel); } -#endif void FIRLogBasic(FIRLoggerLevel level, FIRLoggerService service, @@ -224,32 +135,10 @@ void FIRLogBasic(FIRLoggerLevel level, NSString *message, va_list args_ptr) { FIRLoggerInitializeASL(); - BOOL canLog = level <= sFIRLoggerMaximumLevel; - - if (sFIRLoggerDebugMode) { - canLog = YES; - } else if (sFIRAnalyticsDebugMode && [kFIRLoggerAnalytics isEqualToString:service]) { - canLog = YES; - } - - if (!canLog) { - return; - } -#ifdef DEBUG - NSCAssert(messageCode.length == 11, @"Incorrect message code length."); - NSRange messageCodeRange = NSMakeRange(0, messageCode.length); - NSUInteger numberOfMatches = - [sMessageCodeRegex numberOfMatchesInString:messageCode options:0 range:messageCodeRange]; - NSCAssert(numberOfMatches == 1, @"Incorrect message code format."); -#endif - NSString *logMsg = [[NSString alloc] initWithFormat:message arguments:args_ptr]; - logMsg = - [NSString stringWithFormat:@"%s - %@[%@] %@", FIRVersionString, service, messageCode, logMsg]; - dispatch_async(sFIRClientQueue, ^{ - asl_log(sFIRLoggerClient, NULL, level, "%s", logMsg.UTF8String); - }); + GULLogBasic((GULLoggerLevel)level, service, + sFIRAnalyticsDebugMode && [kFIRLoggerAnalytics isEqualToString:service], messageCode, + message, args_ptr); } -#pragma clang diagnostic pop /** * Generates the logging functions using macros. -- cgit v1.2.3