download2014711 2019-03-13 18:48
浏览 94
已采纳

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

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.SetOutput(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).

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 opencv 无法读取视频
  • ¥15 用matlab 实现通信仿真
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图