Ich versuche mit Go in eine Protokolldatei zu schreiben.
Ich habe verschiedene Ansätze ausprobiert, die alle fehlgeschlagen sind. Folgendes habe ich versucht:
func TestLogging(t *testing.T) {
if !FileExists("logfile") {
CreateFile("logfile")
}
f, err := os.Open("logfile")
if err != nil {
t.Fatalf("error: %v", err)
}
// attempt #1
log.SetOutput(io.MultiWriter(os.Stderr, f))
log.Println("hello, logfile")
// attempt #2
log.SetOutput(io.Writer(f))
log.Println("hello, logfile")
// attempt #3
log.SetOutput(f)
log.Println("hello, logfile")
}
func FileExists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
func CreateFile(name string) error {
fo, err := os.Create(name)
if err != nil {
return err
}
defer func() {
fo.Close()
}()
return nil
}
Die Protokolldatei wird erstellt, aber es wird nie etwas gedruckt oder angehängt. Warum?
Antworten:
os.Open()
muss in der Vergangenheit anders funktioniert haben, aber das funktioniert bei mir:Basierend auf den Go-Dokumenten
os.Open()
kann nicht gearbeitet werdenlog.SetOutput
, da die Datei "zum Lesen:" geöffnet wird.BEARBEITEN
Nach Überprüfung
defer f.Close()
nach verschobenif err != nil
quelle
f
könnte seinnil
, was zu einer Panik führen würde. Eserr
ist daher ratsam, vor dem Aufschieben des Anrufs nachzuschauen.Open
nicht funktioniertlog.SetOutput
?Ich bevorzuge die Einfachheit und Flexibilität der 12-Faktor-App-Empfehlung für die Protokollierung. Zum Anhängen an eine Protokolldatei können Sie die Shell-Umleitung verwenden. Der Standardlogger in Go schreibt in stderr (2).
Siehe auch: http://12factor.net/logs
quelle
$ cd /etc/systemd/system
$ sudo vi app.service ExecStart=/bin/bash -c 'sudo go run main.go >> /home/ubuntu/go/src/html_menu_1/logfile'
ich NICHT arbeitenUbuntu 18.04.3
Normalerweise drucke ich die Protokolle auf dem Bildschirm und schreibe auch in eine Datei. Hoffe das hilft jemandem.
quelle
Das funktioniert bei mir
hat ein Paket namens logger.go erstellt
Importieren Sie das Paket, wo immer Sie sich anmelden möchten, z. B. main.go
quelle
Wenn Sie Binärdateien auf einem Linux-Computer ausführen, können Sie ein Shell-Skript verwenden.
in eine Datei überschreiben
in eine Datei anhängen
Überschreiben Sie stderr in eine Datei
füge stderr in eine Datei ein
Mit der Shell-Skriptdatei kann es dynamischer sein.
quelle
Der Standardlogger in Go schreibt in stderr (2). In Datei umleiten
quelle
Deklarieren Sie sich in Ihrem globalen Bereich als
var
ganz oben, damit alle Ihre Prozesse bei Bedarf darauf zugreifen können.quelle
go version go1.10.2 windows/amd64
, was ist deine?outfile, _ = os.Create("my.log")
und es wird wie erwartet funktionieren.outfile, _ = os.Create("./path/to/my.log")
. Irgendwie hatte ich die Erwartung, dass der Code diepath/to
Ordner und diemy.log
Datei erstellen wird , aber anscheinend hat es nicht funktioniert. Ich würde vorschlagen, dass Sie Ihre Antwort so ändern, dass sie lautetoutfile, _ = os.Create("./my.log")
. Auf diese Weise wissen wir eindeutig, dass im aktuellen Ordner ein Protokoll erstellt wird.Aufbauend auf der Antwort von Allison und Deepak habe ich angefangen, logrus zu verwenden und es gefällt mir wirklich:
Ich habe eine Verschiebung f.Close () in der Hauptfunktion
quelle
Ich schreibe Protokolle in die Dateien, die täglich generiert werden (pro Tag wird eine Protokolldatei generiert). Dieser Ansatz funktioniert gut für mich:
Die Methode "shortenFilePath ()" wird verwendet, um den Namen der Datei aus dem vollständigen Dateipfad abzurufen. und die Methode "LogServer ()" wird verwendet, um eine formatierte Protokollanweisung zu erstellen (enthält: Dateiname, Zeilennummer, Protokollebene, Fehleranweisung usw.)
quelle
Um anderen zu helfen, erstelle ich eine grundlegende Protokollfunktion, um die Protokollierung in beiden Fällen zu handhaben. Wenn Sie möchten, dass die Ausgabe standardisiert wird, aktivieren Sie das Debugging. Es ist einfach, ein Switch-Flag auszuführen, damit Sie Ihre Ausgabe auswählen können.
quelle