我具有用于登录的功能:
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 f
log.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设置输出
答案 0 :(得分:4)
fmt.Printf()
文档将其写入标准输出:
根据格式说明符设置Printf格式,并写入标准输出。
因此没有fmt.SetOutput()
会将其重定向到您的文件。
但是请注意,标准输出是variable in the 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
(正确设置了其输出,因此日志消息将被正确序列化)。