Golang:如何在自定义文件中记录fmt.Printf

时间:2019-03-13 18:48:03

标签: go

我具有用于登录的功能:

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设置输出

1 个答案:

答案 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(正确设置了其输出,因此日志消息将被正确序列化)。