我有這個功能,我用它來記錄:func formattedLog(prefix, m string, color int) { fmt.Printf("\033[%dm%s", color, DateTimeFormat) fmt.Printf("? %s: %s\033[%dm\n", prefix, m, int(Black))}我想將我的日志輸出保存在某個文件中:f, err := os.OpenFile("../../../go-logs.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)if err != nil { log.Fatal("error opening logs file", err)}defer f.Close()//set output of logs to flog.SetOutput(f)log.Println("This is a test log entry") // <====This logs in file但是當我調用我的函數時,它使用 fmt.Printf 它不會登錄文件go-logs.txt:formattedErr("ERR", msg, err.Error(), int(Red))無論如何也為 fmt.Printf 設置輸出
1 回答

達令說
TA貢獻1821條經驗 獲得超6個贊
fmt.Printf()
它寫入標準輸出的文件:
Printf 根據格式說明符格式化并寫入標準輸出。
所以沒有fmt.SetOutput()
將其重定向到您的文件。
但請注意,標準輸出是包中的一個變量os
:
Stdin、Stdout 和 Stderr 是指向標準輸入、標準輸出和標準錯誤文件描述符的打開文件。
請注意,Go 運行時會針對恐慌和崩潰寫入標準錯誤;關閉 Stderr 可能會導致這些消息轉到其他地方,可能會轉到稍后打開的文件。
var?( ????????Stdin??=?NewFile(uintptr(syscall.Stdin),?"/dev/stdin") ????????Stdout?=?NewFile(uintptr(syscall.Stdout),?"/dev/stdout") ????????Stderr?=?NewFile(uintptr(syscall.Stderr),?"/dev/stderr") )
并且您可以將自己的設置os.File
為os.Stdout
.?盡管對記錄器使用相同的方法os.File
并將其設置為不是一個好主意os.Stdout
,但對其File.Write()
方法的訪問不會在fmt
包和記錄器之間同步。
最好是使用log.Logger
everywhere (你正確設置了它的輸出,所以日志消息會被正確地序列化)。
- 1 回答
- 0 關注
- 136 瀏覽
添加回答
舉報
0/150
提交
取消