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")

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


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)

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")
}

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.


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)

-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.")
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.