2010-04-04 5 views
2

크래시 리포터를 만들고있어 ~/라이브러리/로그/CrashReporter 내에서 크래시 리포터 파일을 읽을 수 있습니다.내 코코아 응용 프로그램의 콘솔 로그 얻기

그러나 콘솔 (NScode 및 Console.app에서 모두 볼 수있는 내용)에 콘솔 (NSLog) 정보가 인쇄되어 보고서와 함께 보내고 싶습니다. 그러나, 내 응용 프로그램에 대해서만 로그 을 얻고 싶습니다. 다른 앱의 로그는 필요 없습니다.

특정 앱에 대한 콘솔 로그를 얻는 방법은 무엇입니까?

답변

3

the Apple System Logger API을 사용하면 응용 프로그램에서 보낸 메시지를 시스템 로그에서 검색 할 수 있습니다.

짐 도비 (Jim Dovey)는 a Cocoa wrapper for ASL under a BSD license을 게시했습니다.

일반적으로 시스템 로그는 약 24 시간 이전으로 돌아가며 여러 세션과 여러 번 실행될 수 있습니다. 프로세스 ID가 프로세스 (getpid()) 인 앱 이름 인 발신자 이름이 인 메시지를 검색하십시오.

+0

좋아, Cocoa 래퍼는 나에게 잘 들린다. :) 그러나 내 경우에는 어떻게 사용하는지 보여주는 샘플 코드가 있습니까? 또한 PID와 일치하는 것이 좋습니다. 일반적으로 로그가 전송 될 때 앱이 다음에 실행될 때 이전에 오류가 발생했기 때문에 묻습니다. 연속적인 앱 실행시 PID가 바뀝니 까? – Enchilada

+0

아니요, 샘플 코드가 없습니다. 내 블로그 게시물을 읽고 직장에서의 개념을 이해 한 다음 Dovey의 래퍼 헤더를 읽으십시오. 그가 준 API는 표준 ASL API와 거의 일치합니다. 그리고 예, PID는 연속적인 프로세스에서 다릅니다. 그래서 검색을 원하므로 마지막 프로세스의 결과 만 얻습니다. 마지막 PID를 사용자 기본값으로 저장할 수 있습니다. –

+0

감사합니다. 대단히 감사합니다. 잘 작동하는 것 같습니다. 나중에 참조 할 수 있도록 필자는 필요한 코드를 어떻게 수행했는지 보여주기 위해 여기에 몇 가지 코드를 게시 할 것입니다. – Enchilada

2

NSLog 콘솔에보고 된 메시지는 asl (Apple System Logger)이라는 기능을 통해 전달됩니다. 프로세스에서 기록한 메시지 만 가져 오도록 쿼리를 실행할 수 있습니다. asl_set_query(3) API를 살펴보십시오.

0

앱이 사용자 기본값의 배열에 마지막 몇 개의 PID를 저장하도록하기 위해 다음 updateLastPids 메소드를 작성했습니다. 나는거야 앱이 지난 5 개 실행 나에게 로그를 보낼 수이기 때문에 첫째, 충돌이 있었다 단지의 경우, 내가 5를 사용하고, 그런데

#define kMaxNumberOfPids 5 //should be integer greater than zero! 
#define ENLastPidsUserDefault @"ENLastPidsUserDefault"; 

을 말하자면, 할 수 있는지 확인 마지막 실행보다 일찍 엉망이 된 결과; 원하는 경우 5 대 1로 변경할 수 있습니다. 나는 마지막의 PID에서 콘솔 로그를 얻기 위해 ASL 코코아 래퍼를 사용하는 방법을 보여줍니다 내 옆에 대답에서

- (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]; 
    } 
} 

는 (PID를 이제 위의 방법을 실행 한 후 사용자 기본값에 있어야합니다).

+0

"내 다음 대답은 ..."대답을 편집하여 그 내용을 포함하고 완전한 대답을 하나 가질 수 있습니다. –

+0

'removeLastObject'는 마지막 객체를 제거합니다. 배열에 마지막 5 개가 아니라 마지막 4 개가 아닌 마지막 5 개를 포함하려면 첫 번째 * 객체를 제거해야합니다 (이 코드의 다른 위치에서와 마찬가지로). 또한,이'if' 트리와 루프의 대부분을 잘라낼 수 있습니다. 해결책은 단순히 카운트가 최대 값보다 큰지를 체크하고, 그렇다면'removeObjectsInRange :'를 사용하여 배열의 시작 부분과의 차이를 없앤다. –

+0

Ok thanks :) 그러나 PID는 정말 고유하지 않다는 사실을 알게되었습니다. 다시 시작할 때나 PID 카운터가 오버플로되면 언제든지 다시 호출 할 수 있습니다. 이와 같이 PID를 검색하는 것은 매우 안전한 방법처럼 보이지 않아 내 자신의 앱보다 다른 앱에서 로그를 얻는 것을 끝낼 수 있습니다. 원하지 않는 앱입니다. 그래서 먼저 내 앱 이름을 검색 한 다음 그 결과 중 가장 큰 5 개의 PID 만 표시하도록 필터링합니다. PID를 저장하고 나중에 의존하는 것이 안전하다고 생각합니다. 당신은 어떻게 생각하십니까? – Enchilada

관련 문제