首页 > 嗟来之食 > iOS创建自己的日志系统
2017
10-18

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
 

最后编辑:
作者:
这个作者貌似有点懒,什么都没有留下。

留下一个回复