2016-11-29 3 views
2

Ich baue einen Webserver in Golang. Sie wissen, Golang hat ein context Paket und es ist offically recommended immer einen Kontext als erstes Argument übergeben. context.Context hat eine Value Methode, Variablen in einem Kontext zu halten.Wie kann der Logger zusammen mit dem Kontext verwendet werden?

Die meisten Logging-Bibliotheken bieten jedoch auch eine Möglichkeit, Logger zu erben, zum Beispiel Kind Logger mit Feldern von seinem Elternteil erstellen. In logrus (oder einem anderen Logger, spielt keine Rolle), können Sie eine logrus.Entry erstellen und WithFields anwenden, um eine Kind-Logger zu erhalten.

Zum Beispiel, wenn jede HTTP-Anfrage kommt eine request-id ist angeschlossen. Ich hoffe, dass es in Zusammenhang gebracht und auch als ein Feld in jedem Protokoll protokolliert wird.

Also, wie man das richtig macht?

DANKE !!

+1

Haben Sie versucht, es zu tun tatsächlich oder fragen Sie einfach für uns, es für Sie zu tun? – DallaRosa

+0

Während ein 'Context' einen Ausführungskontext zur Verfügung stellt, kann er viel mehr tun, insbesondere die Löschung. Warum denken Sie, dass "Context" der geeignetste Weg wäre, abgeleitete Logger zu handhaben? (Es ist nicht.) – Volker

+0

Ich mache ziemlich genau, wovon Sie sprechen. Ich habe eine Middleware, die einen "logrus.Entry" mit Sitzungs- und Anforderungsinformationen (URL, Anforderungs-ID usw.) einrichtet. Dann habe ich einen eigenen Log-Pkg mit einer Funktion, die einen Kontext nimmt und einen 'logrus.Entry' zurückgibt, wenn er einen' logrus.Entry' für den Kontext findet, den er benutzt, wenn er nicht einen neuen erzeugt. – jmaloney

Antwort

0

Sie können die request-id aus der eingehenden Anfrage abrufen und dann den Kontext verwenden, um die request-id an die Funktionen übergeben, die Sie aufrufen. Hier ein Beispiel: https://medium.com/@cep21/how-to-correctly-use-context-context-in-go-1-7-8f2c0fafdf39 Für die Protokollierung: Definieren Sie Ihre eigenen Logger die std Log-Bibliothek

func CreateCustomLogger(requestId string) *log.Logger { 
    defaultLoggingFlags := 
log.Ldate|log.Ltime|log.LUTC|log.Lmicroseconds|log.Lshortfile 
    return log.New(os.Stderr, requestId + ": ", defaultLoggingFlags) 
} 

In Ihrer Funktion:

customLogger := CreateCustomLogger(requestId) 
customLogger.Printf("Custom log message") 
Verwandte Themen