// // Copyright © 2016 dahua. All rights reserved. // #define TIMER_INTERVAL 120.0 //120秒判断一次文件是否超过最大容量 #import "LCLogManager.h" @interface LCLogManager() { NSTimer * _timer; //计时器 NSString * _currentPath; //当前日志文件完整路径 NSInteger _index; //日志文件索引 NSString *_logFilePath; //日志文件所在文件夹路径 } @end @implementation LCLogManager #pragma mark - 🍎override method - (instancetype)init { if (self = [super init]) { _isLogging = NO; _maxLogSize = 0.1; _index = 0; _isCycle = NO; } return self; } #pragma mark - 🍊singleton static LCLogManager *instance; + (instancetype)shareInstance { if (nil == instance) { instance = [[LCLogManager alloc]init]; } return instance; } #pragma mark - 🍌public method - (void)startFileLog { //1.更新状态 _isLogging = YES; //2.创建新日志文件夹 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docDirectory = [paths objectAtIndex:0]; NSString *mainDirectory = [docDirectory stringByAppendingPathComponent:@"AppLog"]; if(![[NSFileManager defaultManager]fileExistsAtPath:mainDirectory isDirectory:nil]) { NSError *error; [[NSFileManager defaultManager] createDirectoryAtPath:mainDirectory withIntermediateDirectories:YES attributes:nil error:&error]; NSLog(@"%@", error); } NSString *logDir = [mainDirectory stringByAppendingPathComponent:@"Log"]; if(![[NSFileManager defaultManager]fileExistsAtPath:logDir isDirectory:nil]) { NSError *error; [[NSFileManager defaultManager] createDirectoryAtPath:logDir withIntermediateDirectories:YES attributes:nil error:&error]; NSLog(@"%@", error); } NSDateFormatter *dateFormatter = [NSDateFormatter new]; [dateFormatter setDateFormat:@"yy_MM_dd_HH_mm_ss"]; NSString *dateStr = [dateFormatter stringFromDate:[NSDate date]]; NSString * logDirectory = [logDir stringByAppendingPathComponent:dateStr]; NSLog(@"-----%@",logDirectory); [[NSFileManager defaultManager] createDirectoryAtPath:logDirectory withIntermediateDirectories:YES attributes:nil error:nil]; _logDirectory = logDirectory; //3.开启定时器 if (nil == _timer) { _timer = [NSTimer scheduledTimerWithTimeInterval:TIMER_INTERVAL target:self selector:@selector(timerTick) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes]; //第一次手动写入,之后每120秒定时器判断一次文件是否超过阈值 [self directLogInIndex:_index]; } } - (void)endFileLog { //1.更新状态 _isLogging = NO; //1.销毁定时器 [_timer invalidate]; _timer = nil; //2.停止写入 int result = fclose(stdout); int result2 = fclose(stderr); } - (BOOL)removeSendLogFile { //删除日志文件 if (_logDirectory) { NSError *error; [[NSFileManager defaultManager] removeItemAtPath:_logDirectory error:&error]; NSLog(@"%@", error); if (error == nil) { //恢复默认 _logDirectory = nil; _index = 0; return YES; } return NO; } return NO; } - (NSString *)getLogFilePath { return _logDirectory == nil? nil : _logDirectory; } #pragma mark - 🍑private method //写入日志文件 - (void)directLogInIndex:(NSInteger )idx { //如果已经连接XCode调试则不输出到文件 if(isatty(STDOUT_FILENO)) { return ; } NSString *fileName = [NSString stringWithFormat:@"log%ld.txt", (long)_index]; NSString *logPath = [_logDirectory stringByAppendingPathComponent:fileName]; freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "w+", stdout); freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "w+", stderr); _currentPath = logPath; } //计算单个文件的大小 - (float) fileSizeAtPath:(NSString*) filePath{ NSFileManager* manager = [NSFileManager defaultManager]; if ([manager fileExistsAtPath:filePath]){ float size = [[manager attributesOfItemAtPath:filePath error:nil] fileSize]/(1024.0*1024); return size; } return 0; } #pragma mark - 🍉Timer Action -(void)timerTick { if([self fileSizeAtPath:_currentPath]>_maxLogSize) { if (_isCycle) { _index = !_index; } else { _index ++ ; } [self directLogInIndex:_index]; } } @end