log/slogを使用するときに一貫したコードスタイルを保証するゴーリナー。
log/slog APIは、キー値のペアと属性の2つの異なるタイプの引数を許可します。人々はどちらが優れているかについて異なる意見を持っているかもしれませんが、ほとんどは一つのことに同意しているようです。それは一貫しているべきです。 sloglintを使用すると、好みのコードスタイルに基づいて、 log/slogのさまざまなルールを実施できます。
sloglintはgolangci-lintに統合されており、これが推奨される方法です。
リナーを有効にするには、次の行を.golangci.ymlに追加します。
linters :
enable :
- sloglintまたは、リリースページから事前に構築されたバイナリをダウンロードして、 sloglint Standaloneを使用できます。
sloglintを有効にしてgolangci-lintを実行します。リナーを構成するための利用可能なオプションのリストを参照してください。
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 Forbidden Keysの使用を報告します。
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" ,
)