为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕后森 2023-06-12 17:30:06
我有这个功能,我用它来记录: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.Fileos.Stdout. 尽管对记录器使用相同的方法os.File并将其设置为不是一个好主意os.Stdout,但对其File.Write()方法的访问不会在fmt包和记录器之间同步。

最好是使用log.Loggereverywhere (你正确设置了它的输出,所以日志消息会被正确地序列化)。


查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信