2016-10-19 38 views
0

我使用記錄器,從模式定義我的程序如下寫結果的堆棧跟蹤默認文件

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) 
} 

現在我想寫信堆棧跟蹤的所有信息,如果這些發生,例如從panic()到我的日誌文件。現在,如果有些錯誤是錯誤的,所有這些信息都會打印到IDE中的控制檯上,但是如果porgram在服務器上運行,如果發生一些空指針,函數的錯誤傳遞參數,則會丟失信息,這就是爲什麼我要將此信息寫入日誌文件的原因。 有可能嗎?

+1

你應該可以在服務器上重定向標準錯誤和標準輸出到一個文件(或進入一些其他的記錄機制)。您可以將'os.Stderr'設置爲您應用中的另一個文件,但將其從外部進行管理將更加可靠。 – JimB

+0

這是一個關鍵。試過在golang doc中找到這個函數,但現在什麼都沒有。嘗試了例如'os.Stderr = os.NewFile(uintptr(syscall.Stderr),「/my/log/file.log」),但沒有奏效。我會嘗試其他的東西... unles有人會更快,並找到解決方案 – Mbded

+0

'os.NewFile'只是返回一個新的'* os.File'與該文件描述符,所以它什麼也沒做,除了改變字符串返回通過'os.Stderr.Name()' – JimB

回答

0

使用syscall.Dup2到打開的文件鏈接到標準流

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

或製造恐慌處理器

defer func() { 
     err := recover() 
     if err != nil { 
      //... 
     } 
    }() 
+0

你不能創建一個「全局恐慌處理程序」,因爲你只能在恐慌程序中恢復。 – JimB

+0

@JimB很好的整改 –