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]];
}
}
}
网友评论