【问题标题】:How can I print to Stderr in Go without using log如何在不使用日志的情况下在 Go 中打印到 Stderr
【发布时间】:2015-06-25 14:49:58
【问题描述】:

如何在不使用log 的情况下向 Stderr 写入消息?

A comment in this SO post 展示了如何使用loglog.Println("Message"),但是如果我不想要时间戳怎么办?

下面的Go好不好?

os.Stderr.WriteString("Message")

【问题讨论】:

    标签: error-handling go


    【解决方案1】:

    如果您不想要时间戳,只需创建一个新的log.Logger 并将flag 设置为0

    l := log.New(os.Stderr, "", 0)
    l.Println("log msg")
    

    编辑:

    下面的Go好不好?

    os.Stderr.WriteString("Message")
    

    这个可以接受,也可以使用fmt.Fprintf和朋友获取格式化输出:

    fmt.Fprintf(os.Stderr, "number of foo: %d", nFoo)
    

    【讨论】:

    • 如果您打算使用 stderr 实际记录事物,请使用记录器。否则,一个简单的os.Stderr.WriteString 就足够了,IMO。
    • 最佳答案。虽然,我个人的偏好是使用 fmt.Fprintf 或 fmt.Fprintln。如果你在程序中做了这么多地方,也许将它包装在一个函数中,然后你可以轻松地将 stderr 更改为 stdout 或任何你想要的编写器。
    【解决方案2】:

    使用fmt包,你可以选择这样写stderr

    import "fmt"
    import "os"
    
    func main() {
        fmt.Fprintln(os.Stderr, "hello world")
    }
    

    【讨论】:

      【解决方案3】:

      os.Stderr 是一个io.Writer,所以你可以在任何接受io.Writer 的函数中使用它。以下是几个例子:

      str := "Message"
      fmt.Fprintln(os.Stderr, str)
      io.WriteString(os.Stderr, str)
      io.Copy(os.Stderr, bytes.NewBufferString(str))
      os.Stderr.Write([]byte(str))
      

      这完全取决于您想要打印的字符串的精确程度(即,如果您想先格式化它,如果您将它作为io.Reader,如果您将它作为字节切片......)。而且可以有更多的方法。

      【讨论】:

        【解决方案4】:

        默认情况下,记录器标志设置为Ldate | Ltime。您可以将记录器格式更改为以下任何一种(来自golang log documentation):

        Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23
        Ltime                         // the time in the local time zone: 01:23:23
        Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.
        Llongfile                     // full file name and line number: /a/b/c/d.go:23
        Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile
        LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone
        LstdFlags     = Ldate | Ltime // initial values for the standard logger
        

        例如,标志 Ldate | Ltime(或 LstdFlags)产生,

        2009/01/23 01:23:23 message
        

        虽然标记 Ldate |伦敦时间 | L微秒 | Llongfile 生成,

        2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
        

        您还可以通过将标志设置为 0 来设置默认记录器不打印任何内容:

        log.SetFlags(0)
        

        【讨论】:

          【解决方案5】:

          使用SetOutput函数,设置输出流到os.Stdout

          import (
              "log"
              "os"
          )
          
          func init() {
              log.SetOutput(os.Stdout)
          }
          
          func main() {
              log.Println("Gene Story SNP File Storage Server Started.")
          }
          

          【讨论】:

            【解决方案6】:

            Go 内置函数 printprintln 打印到标准错误。因此,如果您只是想将一些文本输出到 stderr,您可以这样做

            package main
            
            func main() {
                println("Hello stderr!")
            }
            

            文档:https://golang.org/pkg/builtin/#print

            【讨论】:

            • 好提示!但是,它说:“打印对于引导和调试很有用;不能保证保留在语言中。”所以可能不适用于长期项目?
            • IMO、printprintln 用于调试。
            • 确实文件说println 打印到STDERR。不过,默认情况下似乎不会打印到 STDERRgo run ./main.go 2&gt;/dev/null 3&gt;/dev/null 扔掉 STDERR,我仍然得到一个“Hello stderr!”信息。这意味着它正在打印到 STDOUT。我认为@julienc answer fmt.Fprintln(os.Stderr, "Hello stderr!") 也应该是公认的答案。
            • 提醒自己:小心使用| grep 'DEBUG'2&gt;。不知何故,在使用2&gt; 时,我仍然在终端上获得标准错误输出。
            • @SridharSarnobat 一组管道命令中的每个命令都可以独立输出到stderr。请考虑一下:somecommand 2&gt;/dev/null |grep 'DEBUG' 2&gt;/dev/null 以便将 grep 错误发送到 /dev/null 以及 somecommand 错误
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-16
            • 1970-01-01
            • 2017-03-01
            • 1970-01-01
            相关资源
            最近更新 更多