我有这个功能,我用它来记录: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 flog.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 回答
达令说
TA贡献1821条经验 获得超6个赞
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.Logger
everywhere (你正确设置了它的输出,所以日志消息会被正确地序列化)。
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报
0/150
提交
取消