我正在制作一个崩溃记者,我可以在〜/ Library / Logs / CrashReporter中读取崩溃报告文件。
但是,我还想在报告中发送打印到控制台的任何控制台(NSLog)信息(可以在Xcode和Console.app中看到的内容)。但是,我想确保只获取我的应用的日志。我不想要其他应用程序的日志。
如何获取特定应用的控制台日志?
答案 0 :(得分:4)
使用the Apple System Logger API在系统日志中搜索应用程序发送的邮件。
Jim Dovey已发表a Cocoa wrapper for ASL under a BSD license。
请注意,系统日志通常会回溯大约24小时,并且可能包含多个会话和多次运行您的应用。搜索发件人姓名为应用名称和的邮件,其进程ID为您的进程ID(getpid()
)。
答案 1 :(得分:2)
NSLog
消息通过名为asl
(Apple System Logger)的工具发送。您可以运行查询以仅获取流程记录的消息:查看asl_set_query(3)
API。
答案 2 :(得分:0)
为了使应用程序在用户默认值中存储数组中的最后几个PID,我编写了以下updateLastPids方法。首先,确保做,比方说,
#define kMaxNumberOfPids 5 //should be integer greater than zero!
#define ENLastPidsUserDefault @"ENLastPidsUserDefault";
顺便说一下,我正在使用5,因为我要让应用程序向我发送最后5次运行的日志,以防万一崩溃是由于某些事情比最后一次运行更加混乱;如果愿意,你可以将5改为1。
- (void)updateLastPids
{
NSInteger currentPid = [[NSProcessInfo processInfo] processIdentifier];
NSNumber *currentPidNumber = [NSNumber numberWithInt:currentPid];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *lastPidsArray = [[userDefaults arrayForKey:ENLastPidsUserDefault]
mutableCopy];
if (!lastPidsArray)
{
NSArray *newLastPidsArray = [NSArray arrayWithObject:currentPidNumber];
[userDefaults setObject:newLastPidsArray forKey:ENLastPidsUserDefault];
}
else
{
if ([lastPidsArray count] == kMaxNumberOfPids)
{
[lastPidsArray removeObjectAtIndex:0]; //get rid of the oldest PID
[lastPidsArray addObject:currentPidNumber];
NSAssert([lastPidsArray count] == kMaxNumberOfPids, @"invalid count");
}
//In case I decrease kMaxNumberOfPids later on. (Or some PITA user added
//stuff into the array by himself or herself!)
else if ([lastPidsArray count] > kMaxNumberOfPids)
{
[lastPidsArray removeObjectAtIndex:0];
while ([lastPidsArray count] >= kMaxNumberOfPids)
[lastPidsArray removeLastObject];
[lastPidsArray addObject:currentPidNumber];
NSAssert([lastPidsArray count] == kMaxNumberOfPids, @"invalid count");
}
else
{
[lastPidsArray addObject:currentPidNumber];
NSAssert([lastPidsArray count] <= kMaxNumberOfPids, @"invalid count");
}
[userDefaults setObject:lastPidsArray forKey:ENLastPidsUserDefault];
}
}
在我的下一个回答中,我将展示如何使用ASL Cocoa包装器从最后的PID中获取控制台日志(运行上述方法后,PID现在应该是用户默认值)。