Slide 1

Slide 1 text

CocoaLumberjack

Slide 2

Slide 2 text

Hi! I’m Kristian @ksmandersen

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

CocoaLumberjack

Slide 6

Slide 6 text

Why? • NSLog is inflexible • NSLog is slow • NSLog has no levels

Slide 7

Slide 7 text

Performance “[…] I switched out all the logging statements from using NSLog to use CocoaLumberjacks DDLog instead, and saw an increase in performance of almost 6x […]”

Slide 8

Slide 8 text

Performance “[…] I switched out all the logging statements from using NSLog to use CocoaLumberjacks DDLog instead, and saw an increase in performance of almost 6x […]”

Slide 9

Slide 9 text

Performance 1. Open a new connection to ASL daemon 2. Send message to ASL daemon 3. Close that connection 4. Write the same message to STDERR 5. for each NSLog statement: GOTO 1;

Slide 10

Slide 10 text

CocoaLumberjack • Multiple outputs • Different logging levels • Much faster! • Very flexible

Slide 11

Slide 11 text

Getting started [DDLog addLogger:[DDTTYLogger sharedInstance]];

Slide 12

Slide 12 text

LEVELS DDLogError(@"Some error %@, %@", error, error.userInfo); DDLogWarn(@"Unexpected thing"); DDLogInfo(@"Heads up here"); DDLogDebug(@"Bug bug debug"); DDLogVerbose(@"Extreme verbosity");

Slide 13

Slide 13 text

Replacing NSLOG // Making NSLog use Cocoa Lumberjack #define NSLog DDLogInfo

Slide 14

Slide 14 text

Replacing NSLOG // Making NSLog use Cocoa Lumberjack #define NSLog DDLogInfo

Slide 15

Slide 15 text

Colors https://github.com/robbiehanson/XcodeColors

Slide 16

Slide 16 text

AFNetworking AFNetworkActivityLogger *logger = [AFNetworkActivityLogger sharedLogger]; ! [logger setLevel:AFLoggerLevelInfo]]; [logger startLogging];

Slide 17

Slide 17 text

AFNetworking GET http://example.com/foo/bar.json 200 http://example.com/foo/bar.json ! POST http://example.com/other/url.json 503 http://example.com/other/url.json

Slide 18

Slide 18 text

Crashlytics [DDLog addLogger:[CrashlyticsLogger sharedInstance]];

Slide 19

Slide 19 text

Formatters DDLogError(@"Paper Jam!"); // E | Paper Jam! DDLogWarn(@"Low toner."); // W | Low toner. DDLogInfo(@"Doc printed."); // I | Doc printed. DDLogDebug(@"Debugging"); // D | Debugging DDLogVerbose(@"Init doc_parse"); // V | Init doc_parse.

Slide 20

Slide 20 text

Formatters - (NSString *)formatLogMessage:(DDLogMessage *)logMessage { NSString *logLevel; switch (logMessage->logFlag) { case LOG_FLAG_ERROR : logLevel = @"E"; break; case LOG_FLAG_WARN : logLevel = @"W"; break; case LOG_FLAG_INFO : logLevel = @"I"; break; case LOG_FLAG_DEBUG : logLevel = @"D"; break; default : logLevel = @"V"; break; } return [NSString stringWithFormat:@"%@ | %@\n", logLevel, logMessage->logMsg]; }

Slide 21

Slide 21 text

Per logger levels [DDLog addLogger:[DDTTYLogger sharedInstance] withLogLevel:LOG_LEVEL_INFO];

Slide 22

Slide 22 text

PER CLASS LEVEL + (NSArray *)registeredClasses; + (NSArray *)registeredClassNames; ! + (int)logLevelForClass:(Class)aClass; + (int)logLevelForClassWithName:(NSString *)aClassName; ! + (void)setLogLevel:(int)logLevel forClass:(Class)aClass; + (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;

Slide 23

Slide 23 text

App broken w/ no crash

Slide 24

Slide 24 text

App broken w/ no crash

Slide 25

Slide 25 text

Rolling Logs DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; ! [fileLogger setRollingFrequency:60 * 60 * 24]; [fileLogger setMaximumFileSize:1024 * 1024 * 2]; [fileLogger.logFileManager setMaximumNumberOfLogFiles:7]; [DDLog addLogger:fileLogger];

Slide 26

Slide 26 text

DEMO

Slide 27

Slide 27 text

Questions? @ksmandersen

Slide 28

Slide 28 text

jobs.robo.cat