2019-03-13 18:48
浏览 91


I have this function which I use to log:

func formattedLog(prefix, m string, color int) {
    fmt.Printf("\033[%dm%s", color, DateTimeFormat)
    fmt.Printf("▶ %s: %s\033[%dm
", prefix, m, int(Black))

I want to save my log output in some file:

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.Println("This is a test log entry") // <====This logs in file

but when I call my function, which uses fmt.Printf it doesn't log in the file go-logs.txt:

formattedErr("ERR", msg, err.Error(), int(Red))

is there anyway to setoutput also for fmt.Printf

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

  • dongshuo1856 2019-03-13 18:53

    fmt.Printf() documents that it writes to the standard output:

    Printf formats according to a format specifier and writes to standard output.

    So there is no fmt.SetOutput() to redirect that to your file.

    But note that the standard output is a variable in the os package:

    Stdin, Stdout, and Stderr are open Files pointing to the standard input, standard output, and standard error file descriptors.

    Note that the Go runtime writes to standard error for panics and crashes; closing Stderr may cause those messages to go elsewhere, perhaps to a file opened later.

    var (
            Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
            Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
            Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")

    And you are allowed to set your own os.File to os.Stdout. Although it's not a good idea to use the same os.File for a logger and to also set it to os.Stdout, access to its File.Write() method would not be synchronized between the fmt package and the logger.

    Best would be to use a log.Logger everywhere (whose output you properly set, so log messages would properly be serialized).

    解决 无用
    打赏 举报

相关推荐 更多相似问题