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

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


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


慕后森
浏览 98回答 1
1回答

达令说

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.Loggereverywhere (你正确设置了它的输出,所以日志消息会被正确地序列化)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go