使用log/slog時可確保一致的代碼樣式的GO Linter。
log/slog API允許兩種不同類型的參數:鍵值對和屬性。儘管人們可能對哪個更好的觀點有不同的看法,但大多數人似乎對一件事達成共識:這應該是一致的。使用sloglint您可以根據首選的代碼樣式為log/slog執行各種規則。
sloglint集成到golangci-lint中,這是使用它的推薦方法。
要啟用Linter,請將以下行添加到.golangci.yml :
linters :
enable :
- sloglint另外,您可以從“版本”頁面下載預先構建的二進製文件以使用sloglint獨立。
在啟用sloglint的情況下運行golangci-lint 。請參閱配置Linter的可用選項列表。
使用sloglint獨立時,將選項作為同名標誌傳遞。
no-mixed-args選項會導致sloglint在單個函數調用中報告混合鍵值對和屬性:
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 mixed默認情況下啟用它。
kv-only選項會導致sloglint報告任何屬性的使用:
slog . Info ( "a user has logged in" , slog . Int ( "user_id" , 42 )) // sloglint: attributes should not be used相比之下, attr-only選項會導致sloglint報告鍵值對的任何使用:
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: key-value pairs should not be used一些項目更喜歡通過登錄器作為明確的依賴性。 no-global選項會導致sloglint報告使用全局登錄器的使用。
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: global logger should not be used可能的值all (報告所有全局記錄器)和default (僅報告默認的slog記錄器)。
一些slog.Handler實現使用給定context.Context (例如訪問上下文值)。要使他們正常工作,您需要將上下文傳遞給所有記錄器呼叫。 context-only選項會導致sloglint報告沒有上下文的方法的使用:
slog . Info ( "a user has logged in" ) // sloglint: InfoContext should be used instead可能的值all (報告所有無上下文調用)和scope (僅在最外面函數範圍中存在上下文時報告)。
為了充分利用結構化的日誌記錄,您可能需要需要日誌消息才能靜態。 static-msg選項導致sloglint報告非靜態消息:
slog . Info ( fmt . Sprintf ( "a user with id %d has logged in" , 42 )) // sloglint: message should be a string literal or a constant可以通過將動態值移至參數來解決該報告:
slog . Info ( "a user has logged in" , "user_id" , 42 )為了防止錯別字,您可能需要完全使用生鍵。 no-raw-keys選項會導致sloglint報告字符串用作鍵的使用(包括slog.Attr調用,例如slog.Int("user_id", 42) ):
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: raw keys should not be used可以通過使用任何一個常數來解決此報告...
const UserId = "user_id"
slog . Info ( "a user has logged in" , UserId , 42 ) ...或自定義slog.Attr構造函數:
func UserId ( value int ) slog. Attr { return slog . Int ( "user_id" , value ) }
slog . Info ( "a user has logged in" , UserId ( 42 ))提示
sloggen工具可以自動為您生成此類助手。也要嘗試一下!
為了確保日誌的一致性,您可能需要執行單個密鑰命名約定。 key-naming-case選項會導致sloglint報告以外的其他情況以外編寫的密鑰:
slog . Info ( "a user has logged in" , "user-id" , 42 ) // sloglint: keys should be written in snake_case可能的值是snake , kebab , camel或pascal 。
為了防止意外使用預留的日誌鍵,您可能需要完全禁止特定的鍵。 forbidden-keys選項導致sloglint報告禁止鍵的使用:
slog . Info ( "a user has logged in" , "reserved" , 42 ) // sloglint: "reserved" key is forbidden and should not be used例如,當使用標準slog.JSONHandler和slog.TextHandler時,您可能需要禁止time , level , msg和source鍵,因為處理程序使用這些時間。
為了提高代碼可讀性,您可能需要在單獨的行上放置參數,尤其是在使用鍵值對時。 args-on-sep-lines選項導致sloglint在同一行上報告2+參數:
slog . Info ( "a user has logged in" , "user_id" , 42 , "ip_address" , "192.0.2.0" ) // sloglint: arguments should be put on separate lines可以通過重新格式化代碼來解決該報告:
slog . Info ( "a user has logged in" ,
"user_id" , 42 ,
"ip_address" , "192.0.2.0" ,
)