2016-10-19 6 views
0

내가 지금이 내 로그 파일에 panic()에서 예를 들어 발생하는 경우 스택 트레이스의 모든 정보를 기록하고 싶은쓰기 결과 스택 추적 기본값은

var (
    logFile *os.File 
    Info *log.Logger 
) 

func init() { 
    var err error 
    logFile, err = os.OpenFile("/my/file/with.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666) 
    if err != nil { 
     fmt.Printf("Cannot open log file error:%s. Program was terminated.", err) 
     os.Exit(1) 
    } 
    Info = log.New(logFile, 
     "INFO: ", log.Ldate|log.Ltime|log.Lshortfile) 
} 

다음과 같이 패턴에서 정의 내 프로그램에서 로거를 사용하는 파일입니다. 이제 일부가 잘못 되었다면이 모든 정보가 IDE에 콘솔로 출력되지만, porgram이 서버에서 작동하면 null 포인터, 함수 전달 인수가 잘못되었을 때 정보가 손실되므로이 정보를 로그 파일에 기록해야합니다. 가능합니까?

+1

(또는로 일부 다른 로깅 메커니즘). 'os.Stderr'를 앱의 다른 파일로 설정했지만 외부에서 관리하는 것이 더 신뢰할 수 있습니다. – JimB

+0

이것은 열쇠입니다. A는 golang doc에서이 기능을 찾아 보았습니다 만, 지금은 아무 것도 없습니다. A는 예를 들어'os.Stderr = os.NewFile (uintptr (syscall.Stderr), "/my/log/file.log")'를 시도했지만 작동하지 않습니다. 나는 여전히 다른 어떤 것을 시도 할 것입니다 ... 누군가가 더 빨라지고 저에게 해결책을 찾아야합니다. – Mbded

+0

'os.NewFile'은 그 파일 기술자를 가진 새로운'* os.File'을 반환하기 때문에, 반환 된 문자열 변경을 제외하고 아무것도하지 않았습니다 by os.Stderr.Name()' – JimB

답변

0

사용 syscall.Dup2 공황 핸들러 표준 스트림

func main() { 
    syscall.Dup2(int(logFile.Fd()), 2) 
} 

에 열려있는 파일을 연결하거나 만들 수

defer func() { 
     err := recover() 
     if err != nil { 
      //... 
     } 
    }() 
서버의 파일에 표준 오류 및 표준 출력을 리디렉션해야
+0

panicking goroutine에서만 복구 할 수 있기 때문에 "전역 패닉 처리기"를 만들 수 없습니다. – JimB

+0

@JimB 좋은 수정 –