ios日志采集

2021-08-09  本文已影响0人  浅_若清风

stdio(standard input & output)(标准输入输出)。iOS中,我们可以使用stdio类的方法来实现日志采集功能。
1.日志收集

- (void)logcollection
{
    //自定义文件名
    NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSDateFormatter *dateformat = [[NSDateFormatter  alloc]init];
    [dateformat setDateFormat:@"yyyy-MM-dd-HH:mm:ss"];
    NSString *timeStr = [dateformat stringFromDate:[NSDate date]];
    NSString *fileName = [NSString stringWithFormat:@"MY_LOG_FILE&&%@.log",timeStr];
    NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];
    // 先删除已经存在的文件
    NSFileManager *defaultManager = [NSFileManager defaultManager];
    [defaultManager removeItemAtPath:logFilePath error:nil];
    // 将log输入到文件
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
}

logFilePath为自定义的文件名称路径,在保存文件时,因判断目录中是否存在同名文件,存在则先删除,以防重名。freopen函数用于重定向输入输出流,stdout(Standardoutput)表示标准输出,stderr(Standarderror)表示标准错误。
2.自定义打印日志的NSLog

//日志打印
#ifdef DEBUG
#define DSLog(format, ...) printf("class: <%p %s:(%d) > method: %s \n%s\n", self, [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, __PRETTY_FUNCTION__, [[NSString stringWithFormat:(format), ##__VA_ARGS__] UTF8String] )
#else
#define DSLog(format, ...) printf("class: <%p %s:(%d) > method: %s \n%s\n", self, [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, __PRETTY_FUNCTION__, [[NSString stringWithFormat:(format), ##__VA_ARGS__] UTF8String] )
#endif

3使用DSLog打印日志

DSLog(@"xxx")

4.在AppDelegate.m的didFinishLaunchingWithOptions方法里调用logcollection方法,运行程序,则工程里的所有运行到的DSLog打印日志都会自动写入创建的.log文件中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
      [self logcollection];
}

5.获取log日志文件

- (void)getLogFile
{
    //所有符合条件的log日志文件集合
    NSMutableArray *dataAry = [NSMutableArray new];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *tmpPath = [paths objectAtIndex:0];
    NSArray *files = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:tmpPath error:nil];
    //过滤文件,只取MY_LOG_FILE类型文件
    for (int i=0; i<files.count; i++)
   {
        NSString *temStr = files[i];
        if ([temStr containsString:@"MY_LOG_FILE"])
        {
            [dataAry addObject:files[i]];
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读