今天說說怎么創建自己的日志系統
先看下Xcode自己的日志(這里說的NSLog)

系統自帶的NSLog打印的信息只有簡單的 時間 / 項目名稱 / 打印內容
內容比較簡單, 很難做分類管理和寫入文件 或者上傳等等.
今天我們借用CocoaLumberjack 來自定義自己的日志系統, 最終實現的效果為:
#1. Log信息分類
#2. 時間
#3. 產生log的類
#4. 產生log所在方法名
#5. 代碼所在行
#6. log寫入文件
最后並實現log上傳給后台服務器


好了, 下面來說說怎么實現的
首先我們先看下CocoaLumberjack的基本用法
Pod導入
pod 'CocoaLumberjack'
新建pch文件, 並添加:
#import <CocoaLumberjack/CocoaLumberjack.h> static const DDLogLevel ddLogLevel = DDLogLevelDebug;
ddLogLevel可依照需要設置為:
DDLogLevelError / DDLogLevelWarning / DDLogLevelInfo / DDLogDebug / DDLogLevelOff
如果設置為Debug級別, 則 DDLogLevelError / DDLogLevelWarning / DDLogLevelInfo / DDLogLevelDebug都能產生日志
Info級別, 則DDLogLevelError / DDLogLevelWarning / DDLogLevelInfo都能產生日志, DDlogLevelDebug不能產生日志 也不能顯示在xcode console
往前依次類推,
DDLogLevelOff級別是都不顯示也不產生日志
做完以上兩個步驟就完成的前面的配置工作了
然后參照官方的代碼就可以直接用了:
[DDLog addLogger:[DDTTYLogger sharedInstance]]; // TTY = Xcode console [DDLog addLogger:[DDASLLogger sharedInstance]]; // ASL = Apple System Logs DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; // File Logger fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling fileLogger.logFileManager.maximumNumberOfLogFiles = 7; [DDLog addLogger:fileLogger]; ... DDLogVerbose(@"Verbose"); DDLogDebug(@"Debug"); DDLogInfo(@"Info"); DDLogWarn(@"Warn"); DDLogError(@"Error");
但這樣只能打印基本的只有Verbose / Debug等內容的信息
這里我們需要定義自己的樣式, 就是要自己定義DDFileLogger的logFileManager
直接上代碼吧:
#import <Foundation/Foundation.h>
@interface MyCustomFormatter : NSObject <DDLogFormatter> {
int loggerCount;
NSDateFormatter *threadUnsafeDateFormatter;
}
@end
#import "MyCustomFormatter.h"
@implementation MyCustomFormatter
- (id)init {
if((self = [super init])) {
threadUnsafeDateFormatter = [[NSDateFormatter alloc] init];
[threadUnsafeDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss:SSS"];
}
return self;
}
- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
NSString *logLevel;
switch (logMessage->_flag) {
case DDLogFlagError : logLevel = @"Error "; break;
case DDLogFlagWarning : logLevel = @"Warning "; break;
case DDLogFlagInfo : logLevel = @"Info "; break;
case DDLogFlagDebug : logLevel = @"Debug "; break;
default : logLevel = @"Default "; break;
}
NSString *dateAndTime = [threadUnsafeDateFormatter stringFromDate:(logMessage->_timestamp)];
NSString *logMsg = logMessage->_message;
return [NSString stringWithFormat:@"[ %@ %@ ] \n%@", logLevel, dateAndTime, logMsg];
}
- (void)didAddToLogger:(id <DDLogger>)logger {
loggerCount++;
NSAssert(loggerCount <= 1, @"This logger isn't thread-safe");
}
- (void)willRemoveFromLogger:(id <DDLogger>)logger {
loggerCount--;
}
@end
然后按照以下方法配置CocoaLumberjack
//配置CocoaLumberjack
[DDLog addLogger:[DDASLLogger sharedInstance]]; //add log to Apple System Logs
[DDLog addLogger:[DDTTYLogger sharedInstance]]; //add log to Xcode console
[DDTTYLogger sharedInstance].logFormatter = [[MyCustomFormatter alloc] init];
//自定義logfile path
DDLogFileManagerDefault *logFileManager = \
[[DDLogFileManagerDefault alloc] initWithLogsDirectory:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]];
DDFileLogger *customFileLogger = [[DDFileLogger alloc] initWithLogFileManager:logFileManager];
customFileLogger.rollingFrequency = 60 * 60 * 24;
customFileLogger.logFileManager.maximumNumberOfLogFiles = 7;
[DDLog addLogger:customFileLogger];
不過這樣只是完成了自定義自己要的日志格式並自定義路徑
還不能上線上傳, 如果要上傳有兩種方式:
1>直接獲取log文件地址, 上傳
2>創建一個管理類, 來統一管理日志的關閉和啟用
獲取日志文件地址的方法:
customFileLogger.currentLogFileInfo.filePath;
推薦第二個
附上一個我封裝好的Demo, 供大家參考.
https://github.com/zhouxihi/NVLogManager
歡迎大神們指出不足, 跪拜.
也希望大家能不吝star
