Wie kann ich in Go ohne Protokoll auf Stderr drucken?

72

Wie kann ich eine Nachricht an Stderr schreiben, ohne sie zu verwenden log?

Ein Kommentar in diesem SO-Beitrag zeigt, wie es geht log: log.Println("Message")aber was ist, wenn ich keinen Zeitstempel möchte?

Ist das folgende gute Go?

os.Stderr.WriteString("Message")

Max Heiber
quelle

Antworten:

9

Das Go funktioniert printund printlndruckt auf stderr. Wenn Sie also einfach Text an stderr ausgeben möchten, können Sie dies tun

package main

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

Dokumentation: https://golang.org/pkg/builtin/#print

Fornax
quelle
1
Guter Tipp! Es heißt jedoch: "Drucken ist nützlich für das Bootstrapping und Debuggen; es wird nicht garantiert, dass es in der Sprache bleibt. " Also vielleicht nicht für langfristige Projekte?
Daniel Gray
IMO printund printlnwerden zum Debuggen verwendet.
schwächer
104

Wenn Sie keine Zeitstempel möchten, erstellen Sie einfach einen neuen log.Loggermit der flagEinstellung 0:

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

BEARBEITEN:

Ist das folgende gute Go?

os.Stderr.WriteString("Message")

Dies ist akzeptabel, und Sie können auch fmt.Fprintfund friends verwenden, um eine formatierte Ausgabe zu erhalten:

fmt.Fprintf(os.Stderr, "number of foo: %d", nFoo)
Ainar-G
quelle
8
Wenn Sie stderr verwenden, um Dinge tatsächlich zu protokollieren, verwenden Sie einen Logger. Andernfalls reicht eine einfache os.Stderr.WriteString, IMO.
Ainar-G
1
Beste Antwort. Meine persönliche Präferenz ist jedoch die Verwendung von fmt.Fprintf oder fmt.Fprintln. Wenn Sie so viele Stellen in Ihrem Programm ausführen, können Sie es in eine Funktion einbinden. Dann können Sie stderr einfach in stdout oder einen beliebigen gewünschten Writer ändern.
Andrioid
79

Mit dem fmtPaket können Sie folgendermaßen schreiben stderr:

import "fmt"
import "os"

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

os.Stderrist ein io.Writer, so dass Sie es in jeder Funktion verwenden können, die ein akzeptiert io.Writer. Hier einige Beispiele:

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

Es hängt alles davon ab, wie genau Sie die Zeichenfolge haben, die Sie drucken möchten (dh wenn Sie sie zuerst formatieren möchten, wenn Sie sie als haben io.Reader, wenn Sie sie als Byte-Slice haben ...). Und es kann noch viel mehr Möglichkeiten geben.

cd1
quelle
7

Standardmäßig sind die Logger-Flags auf gesetzt Ldate | Ltime. Sie können das Logger-Format wie folgt ändern (aus der Golang-Protokolldokumentation ):

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

Zum Beispiel markiert Ldate | Ltime (oder LstdFlags) produzieren,

2009/01/23 01:23:23 message

Während Flags Ldate | Ltime | Mikrosekunden | Llongfile produzieren,

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

Sie können den Standardlogger auch so einstellen, dass nichts gedruckt wird, indem Sie das Flag auf 0 setzen:

log.SetFlags(0)
Gus E.
quelle
-1

Verwenden Sie die SetOutput-Funktion und setzen Sie den Ausgabestream auf os.Stdout

import (
    "log"
    "os"
)

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

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