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


72

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

这篇SO帖子中的评论显示了如何使用loglog.Println("Message"),但是如果我不想添加时间戳怎么办?

以下是好的Go吗?

os.Stderr.WriteString("Message")

Answers:


9

Go内置函数printprintln打印到stderr。因此,如果您只想向stderr输出一些文本,则可以执行

package main

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

说明文件:https : //golang.org/pkg/builtin/#print


1
好提示!但是,它说:“打印对于引导和调试很有用;它不能保证保留在语言中。 ”所以对于长期项目也许不行吗?
丹尼尔·格雷

IMO,print并且println用于调试。
弱势

104

如果您不想使用时间戳记,只需创建一个新的log.Loggerflag将其设置为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)

8
如果要使用stderr实际记录事物,请使用记录器。否则os.Stderr.WriteString,IMO就足够了。
Ainar-G 2015年

1
最佳答案。虽然,我个人偏爱使用fmt.Fprintf或fmt.Fprintln。如果您要在程序中做很多事情,可以将其包装在一个函数中,则可以轻松地将stderr更改为stdout或所需的任何编写器。
Andrioid

79

使用该fmt包,您可以选择以stderr这种方式编写:

import "fmt"
import "os"

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

16

os.Stderrio.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,如果将其作为字节切片...)。还有更多的方法。


7

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

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 | Ltime | 微秒| Llongfile产生,

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

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

log.SetFlags(0)

-1

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

import (
    "log"
    "os"
)

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

func main() {
    log.Println("Gene Story SNP File Storage Server Started.")
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.