iOS-創建自己的日志系統


今天說說怎么創建自己的日志系統

 

先看下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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM