2016-11-08 3 views
3

Ich implementiere Logger in Go. Ich denke darüber nach, ross zu benutzen. Ich wollte die Einschränkungen des integrierten Protokollpakets verstehen.Einschränkungen von GO lang Protokollpaket

Ich weiß, dass wir diese Funktion manuell hinzufügen müssen, wenn wir Protokolle in Datei schreiben oder rollierende Dateiprotokolle usw. implementieren möchten. Gibt es weitere Einschränkungen, für die wir ein externes Protokollpaket auswählen müssen?

Antwort

2

Logging mit dem eingebauten log Paket-Datei ist kein Problem, können Sie log.SetOutput() oder Logger.SetOutput() verwenden, um eine Datei *os.File ein Ziel io.Writer andere als der Standard os.Stderr, zum Beispiel zu setzen.

Was für fehlt und oft whished einloggt nivelliert (z INFO, WARN, DEBUG, ERROR etc.). Für eine Argumentation, lesen Sie Blogpost Dave Cheney: Let's talk about logging.

Sie können auch keinen spezifischen log.Logger erzwingen, der von bestimmten Paketen verwendet werden soll, es sei denn, diese Pakete "wollen" kooperieren (z. B. bieten sie eine SetLogger() Funktion).

Rolling-Protokolldateien ist auch eine fehlende Funktion.

Auf der anderen Seite ist es auch sehr einfach, den Standard-Logger zu "erweitern", um sich zum Beispiel bei MongoDB anzumelden, für Details siehe Go: Create io.Writer inteface for logging to mongodb database. Mit MongoDB können Sie auch eine Capped collection verwenden, die Ihnen implizit eine "Rolling File" -Funktionalität bietet.

2

Das Protokollieren in einer Datei kann auf mehrere Arten erfolgen. Die 12-Faktor-App-Methode (nicht nur die 12-Faktor-App-Weg, sondern 12-Faktor-Apps machen dies auf diese Weise) wäre es, auf STDOUT und/oder STDERR zu loggen und dann zu leiten anderswo für die Bereitstellung. Dies macht auch die Entwicklung einfach. Wenn Sie Ihr Programm mit etwas wie Containern bereitstellen, protokollieren sie die STDOUT- und STDERR-Dateien des Containers zunächst in einer Datei.

Das Paket std lib log bietet zwei Möglichkeiten, die Ausgabe in eine Datei zu ändern.

Ein Weg ist wie folgt:

log.SetOutput(<something that implements io.Writer, probably os.File>) 

log.Println("some message") 

Das andere ist:

logger := log.New(<something that implements io.Writer, probably os.File>, <a prefix String>, <some flag, see https://golang.org/pkg/log/#pkg-constants>) 

logger.Println("some message") 

Die zweite Option ist auch, wie Sie verschiedene Protokollebenen implementieren können (dh INFO, DEBUG, WARN, ERROR, usw.), indem jeder Level ein eigener Logger ist.

Allerdings bietet Ihnen logrus eine Menge davon, also ist das wahrscheinlich Ihre beste Wahl, wenn Sie nur schnell Logging implementiert haben möchten.