我有这个功能,我用它来记录:
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设置setoutput
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
(您正确设置其输出,因此日志消息将被正确序列化)。