2012-03-08 2 views
23

NSog()을 파일로 리디렉션하고 싶지만 여전히 콘솔에서 출력을보고 싶습니다. 나는 stderr 사용 파일로 리디렉션 할 수 있다는 것을 알고하지 :콘솔과 파일 모두에 대한 NSLog()

freopen("file.log", "a+", stderr); 

하지만 파일에 그것을 리디렉션 후, 로그는 더 이상 콘솔 출력에 표시됩니다.

사용자 지정 래퍼를 NSLog() 주위에 만들 수 있지만 응용 프로그램 충돌이 발생했을 때 stderr에 기록 된 충돌 로그는 기록되지 않습니다.

나는 또한 dup() 및 파일 설명자를 복제하는 다른 방법을 실험하고 있었지만 출력은 파일이나 콘솔에서 ether이었으며 결코 둘 다 사용하지 않았습니다.

비슷한 질문이 여기에 있습니다. Write stderr on iPhone to both file and console 답변이 없거나 NSLog() 래퍼를 사용하도록 제안하지 않았습니다.

누구나이 작업을 관리하는 방법에 대한 아이디어가 있습니까? 고맙습니다.

UPDATE : 리디렉션의 가장 중요한 부분은 콘솔과 파일 모두에 기록 시스템 오류 로그 (열려진을)하는 것입니다.

+0

두 개의 개별 로그를 만들고 파일 하나를 보내고 콘솔 하나를 콘솔로 보내지 만 동일하게 유지하면 어떨까요? – JTApps

+0

어떻게 관리 하시겠습니까? 가장 중요한 것은 콘솔과 파일 모두에 시스템 오류 로그를 기록하는 것입니다. –

+2

'NSLog'는 기본적으로 콘솔에 로그를 남깁니다. 아마도 거기에서 로그를 추출 할 수 있습니다. http://stackoverflow.com/questions/7150849/how-can-i-get-a-console-read-at-runtime-in -an-application/7151773 # 7151773 – Joe

답변

8

According to the docs 사용자 지정 로그 기능이 필요합니다.

당신은 최소한 필요 NSLog fprintf와 같은 뭔가 가변 인수 및 printd을받는 함수 :

void myLog(NSString* format, ...) 
{ 
    va_list argList; 
    va_start(argList, format); 
    NSString* formattedMessage = [[NSString alloc] initWithFormat: format arguments: argList]; 
    va_end(argList); 
    NSLog(@"%@", formattedMessage); 
    fprintf(myFileDescriptor, "%s\n", [formattedMessage UTF8String]); 
    [formattedMessage release]; // if not on ARC 
} 

또는 코코아 로깅 프레임 워크가있다.

Looking for a Specific Cocoa Logging Framework

+0

감사합니다. 괜찮습니다. 그러나 업데이트 된 질문을 확인하십시오. 나는 콘솔과 파일뿐만 아니라 내 사용자 정의 로그에 시스템의 stderr 로그를 얻는 방법을 찾고있다. 감사. –

+0

@Miroslav : 나는 당신에게 준 것과 비슷한 변화가 없다고 생각하지 않습니다. – JeremyP

25

우리가 구현 한 방법은 다음과 같습니다

if (!isatty(STDERR_FILENO)) { 
    // Redirection code 
} 

이는 콘솔이 연결되어있는 경우, 당신은 당신이 때문에 파일에 이러한 로그를 저장하지 않아도 일반 가정에 기초 이미 디버깅 중입니다. 따라서 콘솔이 연결될 때마다 로그가 그곳에 인쇄되거나 그렇지 않으면 파일에 저장됩니다.

+0

굉장! 이것은 내가 필요한 것입니다! Sailesh에게 감사드립니다. –