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

问题描述 投票:1回答:1

我有这个功能,我用它来记录:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.