JLChen
2021-11-04 1443556e9ccb1a19ed8e6710c16c8adc4d4f4fb3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
//
//  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