In Go stellt die Ablaufverfolgungsprotokollierung eine einzigartige Herausforderung dar: Minimierung der Kosten für deaktivierte Protokollanweisungen in kritischen Pfaden. Im Gegensatz zu C/C verfügt Go über keine Präprozessormakros, sodass alternative Lösungen untersucht werden müssen.
Ein Ansatz besteht darin, die Schnittstellen fmt.Stringer und fmt.GoStringer zu verwenden. Durch die Verzögerung der Formatierung bis zur Protokollausführung können teure Funktionsaufrufe in den Protokollierungsargumenten vermieden werden:
type LogFormatter interface { LogFormat() string } // Inside the logger if i, ok := i.(LogFormatter); ok { fmt.Println(i.LogFormat()) }
Eine andere Strategie besteht darin, den Logger zur Laufzeit mithilfe einer Logger-Schnittstelle oder zur Build-Zeit mithilfe von Build-Einschränkungen auszutauschen. Dazu muss jedoch sichergestellt werden, dass keine teuren Aufrufe in die Protokollierungsargumente eingefügt werden.
Eine dritte Option besteht darin, den Logger selbst als Bool zu definieren, um die Ausführlichkeit zu reduzieren und gleichzeitig eine knappere Möglichkeit zur Steuerung der Protokollierung bereitzustellen:
type Log bool func (l Log) Println(args ...interface{}) { fmt.Println(args...) } var debug Log = false if debug { debug.Println("DEBUGGING") }
Abschließend kann die Codegenerierung untersucht werden, obwohl sie nicht für die Laufzeitkonfiguration geeignet ist. Durch die Verwendung von gofmt -r oder das Erstellen von Dateien mithilfe von Text/Vorlage ist es möglich, separate Debug-Builds für bestimmte Debugging-Szenarien zu erstellen.
Das obige ist der detaillierte Inhalt vonWie können die Kosten für deaktivierte Trace-Protokollierungsanweisungen in Go minimiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!