获取我的Cocoa应用程序的控制台日志

时间:2010-04-04 11:05:11

标签: objective-c cocoa

我正在制作一个崩溃记者,我可以在〜/ Library / Logs / CrashReporter中读取崩溃报告文件。

但是,我还想在报告中发送打印到控制台的任何控制台(NSLog)信息(可以在Xcode和Console.app中看到的内容)。但是,我想确保只获取我的应用的日志。我不想要其他应用程序的日志。

如何获取特定应用的控制台日志?

3 个答案:

答案 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现在应该是用户默认值)。