A Go -Linter, der bei Verwendung von log/slog einen konsistenten Codestil gewährleistet.
Die log/slog API ermöglicht zwei verschiedene Argumentenarten: Schlüsselwertpaare und -attribute. Während die Menschen möglicherweise unterschiedliche Meinungen darüber haben, welche besser ist, scheinen sich die meisten auf eine Sache zuzustimmen: Es sollte konsistent sein. Mit sloglint können Sie verschiedene Regeln für log/slog basierend auf Ihrem bevorzugten Codestil erzwingen.
sloglint ist in golangci-lint integriert, und dies ist die empfohlene Möglichkeit, diese zu verwenden.
Fügen Sie so die folgenden Zeilen zu .golangci.yml hinzu:
linters :
enable :
- sloglint Alternativ können Sie eine vorgefertigte Binärdatei von der Releases -Seite herunterladen, um sloglint Standalone zu verwenden.
Führen Sie golangci-lint mit aktivierter sloglint aus. Siehe die Liste der verfügbaren Optionen, um den Linter zu konfigurieren.
Wenn Sie sloglint Standalone verwenden, übergeben Sie die gleichnamigen Optionen als Flaggen.
Die Option no-mixed-args bewirkt, dass sloglint die Mischung von Tastenwerten und Attributen innerhalb eines einzelnen Funktionsaufrufs mischt:
slog . Info ( "a user has logged in" , "user_id" , 42 , slog . String ( "ip_address" , "192.0.2.0" )) // sloglint: key-value pairs and attributes should not be mixedEs ist standardmäßig aktiviert.
Die Option kv-only führt dazu, dass sloglint über die Verwendung von Attributen berichtet wird:
slog . Info ( "a user has logged in" , slog . Int ( "user_id" , 42 )) // sloglint: attributes should not be used Im Gegensatz dazu veranlasst die attr-only -Option sloglint , über die Verwendung von Schlüsselwertpaaren zu berichten:
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: key-value pairs should not be used Einige Projekte bevorzugen es, Holzfäller als explizite Abhängigkeiten zu bestehen. Die no-global Option veranlasst sloglint , die Verwendung globaler Holzfäller zu melden.
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: global logger should not be used Mögliche Werte sind all (melden Sie alle globalen Holzfäller) und default (melden Sie nur den Standard slog -Protokoll).
Einige slog.Handler -Implementierungen verwenden den angegebenen context.Context (z. B. auf Kontextwerte zugreifen). Damit sie ordnungsgemäß arbeiten können, müssen Sie einen Kontext an alle Logger -Anrufe weitergeben. Die Option context-only führt dazu, dass sloglint die Verwendung von Methoden ohne Kontext meldet:
slog . Info ( "a user has logged in" ) // sloglint: InfoContext should be used instead Mögliche Werte sind all (melden Sie alle kontextlosen Aufrufe) und scope (Bericht nur, wenn ein Kontext im Bereich der äußersten Funktion vorliegt).
Um das Beste aus strukturierter Protokollierung herauszuholen, möchten Sie möglicherweise, dass Protokollnachrichten statisch sind. Die static-msg -Option veranlasst sloglint , nicht statische Nachrichten zu melden:
slog . Info ( fmt . Sprintf ( "a user with id %d has logged in" , 42 )) // sloglint: message should be a string literal or a constantDer Bericht kann durch Verschieben von dynamischen Werten in Argumente behoben werden:
slog . Info ( "a user has logged in" , "user_id" , 42 ) Um Tippfehler zu verhindern, möchten Sie möglicherweise die Verwendung von Rohschlüssel insgesamt verbieten. Die Option no-raw-keys bewirkt sloglint , die Verwendung von Zeichenfolgen als Schlüssel zu melden (einschließlich slog.Attr -Anrufe, z. B. slog.Int("user_id", 42) ):
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: raw keys should not be usedDieser Bericht kann durch Verwendung von beiden Konstanten repariert werden ...
const UserId = "user_id"
slog . Info ( "a user has logged in" , UserId , 42 ) ... oder benutzerdefinierte slog.Attr -Konstruktoren:
func UserId ( value int ) slog. Attr { return slog . Int ( "user_id" , value ) }
slog . Info ( "a user has logged in" , UserId ( 42 ))Tipp
Solche Helfer können vom sloggen -Tool automatisch für Sie generiert werden. Probieren Sie es auch aus!
Um eine Konsistenz in Protokollen zu gewährleisten, möchten Sie möglicherweise eine einzelne Schlüsselnamenkonvention durchsetzen. Die Option key-naming-case bewirkt, dass sloglint in einem anderen Fall als dem angegebenen Schlüssel meldet:
slog . Info ( "a user has logged in" , "user-id" , 42 ) // sloglint: keys should be written in snake_case Mögliche Werte sind snake , kebab , camel oder pascal .
Um die versehentliche Verwendung reservierter Protokollschlüssel zu verhindern, möchten Sie möglicherweise bestimmte Schlüssel verbieten. Die Option forbidden-keys veranlasst sloglint , die Verwendung von verbotenen Schlüsseln zu melden:
slog . Info ( "a user has logged in" , "reserved" , 42 ) // sloglint: "reserved" key is forbidden and should not be used Wenn Sie beispielsweise die Standard slog.JSONHandler und slog.TextHandler verwenden, möchten Sie möglicherweise die time , level , msg und source verbieten, da diese von den Handlern verwendet werden.
Um die Code-Lesbarkeit zu verbessern, möchten Sie möglicherweise Argumente in separate Zeilen einfügen, insbesondere wenn Sie Schlüsselwertpaare verwenden. Die Option args-on-sep-lines bewirkt, dass sloglint 2+ Argumente in derselben Zeile meldet:
slog . Info ( "a user has logged in" , "user_id" , 42 , "ip_address" , "192.0.2.0" ) // sloglint: arguments should be put on separate linesDieser Bericht kann durch die Neuformatierung des Kodex festgelegt werden:
slog . Info ( "a user has logged in" ,
"user_id" , 42 ,
"ip_address" , "192.0.2.0" ,
)