3 回答

TA貢獻1811條經驗 獲得超4個贊
這樣做的正確方法是將 main 中的句柄傳遞給SetupLogging:
func SetupLogging(lf *os.File) {
log.SetOutput(io.MultiWriter(os.Stderr, logFile))
log.Println("Started")
}
func main() {
logFile, err := os.OpenFile("test.log", os.O_APPEND|os.O_CREATE, 0666)
if err != nil {
log.Panicln(err)
}
defer logFile.Close()
SetupLogging(logFile)
log.Println("Test message")
}
另一種選擇是使用runtime.SetFinalizer,但并不總是保證在主退出之前運行。
func SetupLogging() {
logFile, err := os.OpenFile("test.log", os.O_APPEND|os.O_CREATE, 0666)
if err != nil {
log.Panicln(err)
}
runtime.SetFinalizer(logFile, func(h *os.File) {
h.Close()
})
log.SetOutput(io.MultiWriter(os.Stderr, logFile))
}

TA貢獻1851條經驗 獲得超3個贊
我現在已經在多個項目中成功使用了以下方法大約一年。這個想法是從設置調用返回一個函數。結果函數包含銷毀邏輯。下面是一個例子:
package main
import (
"fmt"
"io"
"log"
"os"
)
func LogSetupAndDestruct() func() {
logFile, err := os.OpenFile("test.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
if err != nil {
log.Panicln(err)
}
log.SetOutput(io.MultiWriter(os.Stderr, logFile))
return func() {
e := logFile.Close()
if e != nil {
fmt.Fprintf(os.Stderr, "Problem closing the log file: %s\n", e)
}
}
}
func main() {
defer LogSetupAndDestruct()()
log.Println("Test message")
}
它在被延遲的清理邏輯周圍使用了一個閉包。
- 3 回答
- 0 關注
- 261 瀏覽
添加回答
舉報