Error handling 如何在不使用日志的情况下在Go中打印到Stderr

Error handling 如何在不使用日志的情况下在Go中打印到Stderr,error-handling,go,Error Handling,Go,如何在不使用log的情况下将消息写入Stderr 演示如何使用log:log.Println(“消息”),但是如果我不需要时间戳怎么办 以下是好消息吗 os.Stderr.WriteString("Message") os.Stderr.WriteString(“Message”)如果不需要时间戳,只需创建一个新的标志,将设置为0: l := log.New(os.Stderr, "", 0) l.Println("log msg") 编辑: 以下是好消息吗 os.Stderr.WriteS

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

演示如何使用
log
log.Println(“消息”)
,但是如果我不需要时间戳怎么办

以下是好消息吗

os.Stderr.WriteString("Message")

os.Stderr.WriteString(“Message”)

如果不需要时间戳,只需创建一个新的
标志,将
设置为
0

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

以下是好消息吗

os.Stderr.WriteString("Message")
这是可以接受的,您还可以使用和friends获得格式化输出:

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

使用
fmt
软件包,您可以通过以下方式选择写入
stderr

import "fmt"
import "os"

func main() {
    fmt.Fprintln(os.Stderr, "hello world")
}
是,因此您可以在任何接受
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))

这完全取决于您想要打印的字符串的精确程度(即,如果您想先格式化它,如果您将它作为一个,如果您将它作为一个字节片…)。还有很多方法。

默认情况下,记录器标志设置为
Ldate | Ltime
。您可以将记录器格式更改为以下任意格式(从):

当标志Ldate | Ltime | Lmicroseconds | Llongfile生成时

2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
您还可以通过将标志设置为0,将默认记录器设置为不打印任何内容:

log.SetFlags(0)

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

import (
    "log"
    "os"
)

func init() {
    log.SetOutput(os.Stdout)
}

func main() {
    log.Println("Gene Story SNP File Storage Server Started.")
}

Go内置函数
print
println
打印到stderr。因此,如果您只是想向stderr输出一些文本,您可以这样做

package main

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

文档:

如果要使用stderr实际记录事情,请使用记录器。否则,一个简单的
os.Stderr.WriteString
就足够了,这是最好的答案。尽管如此,我个人的偏好是使用fmt.Fprintf或fmt.Fprintln。如果你在你的程序中做了这么多的事情,也许可以把它包装成一个函数,然后你就可以很容易地把stderr改成stdout或者任何你想要的编写器。好提示!然而,它说:“打印对于引导和调试是有用的;它不能保证保留在语言中。”因此,对于长期项目可能不是这样?IMO,
Print
println
用于调试。实际上,文档中说,
println
打印到STDERR。不过,默认情况下,它似乎不会打印到STDERR。通过
go run./main.go 2>/dev/null 3>/dev/null
扔掉STDERR,我仍然收到一条“Hello STDERR!”消息。这意味着它正在打印到标准输出。我认为@julienc
fmt.Fprintln(os.Stderr,“Hello Stderr!”)
也应该是公认的答案。自我提醒:在结合使用
| grep'DEBUG'
时要小心。不知何故,在使用
2>
时,我仍然在终端上获得stderr输出。这应该是可以接受的answer@ManuManjunath我同意
package main

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