In Go stellt die Ablaufverfolgungsprotokollierung eine einzigartige Herausforderung dar: die 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, was die Ausführlichkeit reduziert und gleichzeitig eine knappere Möglichkeit bietet, die Protokollierung zu steuern:
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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3