2017-02-27 45 views
1

是否有任何方法將輸出從恐慌重定向到每個恐慌具有時間戳的文件。恐慌日誌文件的將恐慌輸出重定向到golang中的具有時間戳的文件

當前示例結果:

goroutine 6 [running]: 
_/C_/....func·001(0x11691e80, 0x1a, 0x0, 0x0, 0x10d3550, 0x11691ec0, 0x0, 0x0) 
C:/.../Logger.go:309 +0x47 
path/filepath.Walk(0x11691e80, 0x1a, 0x1161defc, 0x0, 0x0) 
c:/...../path.go:392 +0x97 
_/C_/...../Logger.Sample(0x1168ac00, 0x59, 0x0, 0x0) 
C:/...../Logger.go:322 +0x1c5 
main.handleFileActions() 
C:/...../main.go:453 +0x2ad 
created by main.main 
C:/..../main.go:278 +0x6ea 

預期結果:

2017-02-27T14:24:22.627Z - goroutine 6 [running]: 
_/C_/....func·001(0x11691e80, 0x1a, 0x0, 0x0, 0x10d3550, 0x11691ec0, 0x0, 0x0) 
C:/.../Logger.go:309 +0x47 
path/filepath.Walk(0x11691e80, 0x1a, 0x1161defc, 0x0, 0x0) 
c:/...../path.go:392 +0x97 
_/C_/...../Logger.Sample(0x1168ac00, 0x59, 0x0, 0x0) 
C:/...../Logger.go:322 +0x1c5 
main.handleFileActions() 
C:/...../main.go:453 +0x2ad 
created by main.main 
C:/..../main.go:278 +0x6ea 
+0

[在golang捕獲恐慌()]的可能的複製(http://stackoverflow.com/questions/34772012/capturing-panic-in-golang)。 – icza

+0

我可能沒有解釋我自己的權利,我已經設法捕捉到恐慌,我的問題是,是否有一個選項記錄恐慌與時間戳,如預期的結果示例中,我可以共享我的代碼,如果需要的話。 – Elad

+2

如果你使用了'recover()',那麼你可以在記錄恐慌之前執行print(time.Now()。UTC().Format(「2006-01-02T15:04:05.000Z - 」))'' 。否則,我不這麼認爲。 – icza

回答

0

是可能的時間戳添加到您的日誌文件。

因爲錯誤也只是價值觀,所以你可以在恐慌之前做點事情。

只是一個簡單的例子:

var buf bytes.Buffer 
logger := log.New(&buf, "logger: ", log.Ldate|log.Ltime|log.Llongfile) 
logger.Print("Error when calling that code") 
fmt.Print(&buf) 
logger.Panic("Error") 

https://play.golang.org/p/g4mweH4Dex

在這裏,你不應該儘快出現你的錯誤恐慌。您可以在日誌中寫入更多信息。例如你的函數的參數或配置文件的值。

在記錄器定義log.Ldate|log.Ltime|log.Llongfile中有正確的標記,您還將獲得一個時間戳。

編輯: 感謝reticentroot有關恢復包裝的評論。文章Defer, Panic and Recover描述瞭如何處理恐慌。在這裏你可以使用延遲恢復。

func main() { 
    myFunc() 
    fmt.Print(&buf) 
} 

func myFunc() { 
    defer func() { 
     if r := recover(); r != nil { 
      logger.Println("Recovered from panic: ", r) 
     } 
    }() 
    myPanic() 
} 

func myPanic() { 
    panic("Panicking in myPanic") 
} 

https://play.golang.org/p/8swGF1SoO_

+0

最好將上面的代碼放在recover()包裝器中,以便OP可以「捕捉」所有恐慌並將它們記錄到文件中。它是Web服務器的常見模式,但我相信它也可以在這裏工作。 – reticentroot

+0

如何使用上述示例捕獲所有恐慌並將它們記錄到帶有時間戳的文件? – Elad

+0

我已經添加了一個鏈接去遊樂場。這是邏輯。在該記錄器中使用'bytes.Buffer'。您可以將輸出寫入文件而不是打印。你也可以使用另一個'io.Writer'直接寫入文件。 – apxp