~ NSLogを過去にする ~
CocoaLumberJackios_社内LT
内定者 - 羽田(ジャンボ) - @jumbOS5 3/27
NSLogで満足してるんですか?今までのNSLog
↓ マクロで色々書く・・・
マクロって何?柔軟じゃなくない?×
マグロといえば
備長炭火焼 "jige" 築地店
骨付きマグロの中落ちが絶品だそうです・・・ 行きたひ(๑́ڡ`๑)
ログを使えよエンジニア• 好みの形式のログを取りたい! • リリースビルドではログを出したくない! • ログファイルをつくりたい! • 外部サービスには頼りたくない! • pod使ってる!
CocoaLumberJack
CocoaLumberJack
podで入れる事のできるOSSのログ管理ライブラリ、「リリース時はログを出力しない」「独自フォーマットでのログの出力」「ログの保存」
などなどを簡単に作れる。*ちなみにlumberjackは「きこり」という意味
導入
1. pod ‘CocoaLumberjack'
2. pod install
3. ソースをちょっと書く
「独自フォーマットでログを出力し、指定ディレクトリに保存。 リリースビルド時には表示されないようにすることを目的とする」
手順
手を加えるソース
1. Appdelegate
2. xxx-Prefix.pch
3. 独自フォーマットクラス <- 作る
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // コンソールログ DDTTYLogger *ttyLogger = [DDTTYLogger sharedInstance]; ttyLogger.logFormatter = [[CLTCustomFormatter alloc] init]; [DDLog addLogger:ttyLogger]; // ファイル出力ログ // ログファイル保存場所 NSString *logPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Logs/"]; DDLogFileManagerDefault *logFileManager = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:logPath]; self.fileLogger = [[DDFileLogger alloc] initWithLogFileManager:logFileManager]; self.fileLogger.logFormatter = [[CLTCustomFormatter alloc] init]; // ログファイル最大サイズ:10MB self.fileLogger.maximumFileSize = 10 * 1024 * 1024; // ログファイル最大個数:5個 self.fileLogger.logFileManager.maximumNumberOfLogFiles = 5; [DDLog addLogger:self.fileLogger]; DDLogInfo(@"%@", self.fileLogger.logFileManager.logsDirectory); ! return YES; }
Appdelagete
xxx-Prefix.pch// // Prefix header // // The contents of this file are implicitly included at the beginning of every source file. // !#import <Availability.h> #import <CocoaLumberjack/DDLog.h> #import <CocoaLumberjack/DDTTYLogger.h> #import <CocoaLumberjack/DDLog+LOGV.h> #import <CocoaLumberjack/DDASLLogger.h> !#ifndef __IPHONE_5_0 #warning "This project uses features only available in iOS SDK 5.0 and later." #endif !#ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #endif !#ifdef DEBUG // デバッグ時は全レベルのログを表示する static const int ddLogLevel = LOG_LEVEL_VERBOSE; #else // リリース時はログを表示しない static const int ddLogLevel = LOG_LEVEL_OFF; #endif
独自フォーマットクラス
https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters
- (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; } NSString *dateAndTime = [self stringFromDate:(logMessage->timestamp)]; NSString *logMsg = logMessage->logMsg; NSString *fileName = logMessage.fileName; NSString *methodName = logMessage.methodName; int lineNumber = logMessage->lineNumber; NSString *threadID = logMessage.threadID; return [NSString stringWithFormat:@"%@ (%@) %@ [%@(%d) %@] %@", dateAndTime, threadID, logLevel, fileName, lineNumber, methodName, logMsg]; }
使い方• 独自フォーマットクラスのimport
• ログの出力
DDLogError(@"Paper Jam!"); DDLogWarn(@"Low toner."); DDLogInfo(@"Doc printed."); DDLogDebug(@"Debugging"); DDLogVerbose(@"Init doc_parse”);
結果とデモ
!2014/03/25 11:22:35 (60b) E [CLTViewController(20) viewDidLoad] Paper Jam! 2014/03/25 11:22:35 (60b) W [CLTViewController(21) viewDidLoad] Low toner. 2014/03/25 11:22:35 (60b) I [CLTViewController(22) viewDidLoad] Doc printed. 2014/03/25 11:22:35 (60b) D [CLTViewController(23) viewDidLoad] Debugging 2014/03/25 11:22:35 (60b) V [CLTViewController(24) viewDidLoad] Init doc_parse
まとめ
pod時代のFlexible Loggerである CocoaLumberJack!!
いつ使うの!!!!?????
(¦3[___]
時間のある時にやってみてください・・・zzz
https://github.com/jumbo-in-Jap/cocoalumberjackTest
サンプルとか置いときます。
発展
+ +
_人人人人人人人人人人人_ > すごいログシステム < ‾Y^Y^Y^Y^Y^Y^Y^Y^Y^Y‾
ストリームデータのiosアプリから出るログをストリームで取得、mongoDBにリアルタイムで入れて集計、「キー(メソッドとか)ごとに何件エラーログがあったか?」「infoに出力
された値の合計値の取得」などをJS(MongoShell)で書けるクールな状況。
次回予告
内定者 正社員Evolution.
AutoLayout - Live Coding7.1からのいじりどこ
coming soon…