Linter go yang memastikan gaya kode yang konsisten saat menggunakan log/slog .
API log/slog memungkinkan dua jenis argumen yang berbeda: pasangan dan atribut nilai-kunci. Sementara orang mungkin memiliki pendapat berbeda tentang mana yang lebih baik, sebagian besar tampaknya menyetujui satu hal: itu harus konsisten. Dengan sloglint Anda dapat menegakkan berbagai aturan untuk log/slog berdasarkan gaya kode pilihan Anda.
sloglint diintegrasikan ke dalam golangci-lint , dan ini adalah cara yang disarankan untuk menggunakannya.
Untuk mengaktifkan linter, tambahkan baris berikut ke .golangci.yml :
linters :
enable :
- sloglint Atau, Anda dapat mengunduh biner prebuilt dari halaman rilis untuk menggunakan sloglint mandiri.
Jalankan golangci-lint dengan sloglint diaktifkan. Lihat daftar opsi yang tersedia untuk mengonfigurasi linter.
Saat menggunakan sloglint Standalone, berikan opsi sebagai bendera dengan nama yang sama.
Opsi no-mixed-args menyebabkan sloglint melaporkan pencampuran pasangan nilai kunci dan atribut dalam satu panggilan fungsi:
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 mixedDiaktifkan secara default.
Opsi kv-only menyebabkan sloglint melaporkan penggunaan atribut apa pun:
slog . Info ( "a user has logged in" , slog . Int ( "user_id" , 42 )) // sloglint: attributes should not be used Sebaliknya, opsi attr-only menyebabkan sloglint melaporkan segala penggunaan pasangan nilai kunci:
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: key-value pairs should not be used Beberapa proyek lebih suka meneruskan logger sebagai dependensi eksplisit. Opsi no-global menyebabkan sloglint melaporkan penggunaan penebang global.
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: global logger should not be used Nilai -nilai yang mungkin all adalah (laporkan semua penebang global) dan default (laporkan hanya logger slog default).
Beberapa implementasi slog.Handler memanfaatkan context.Context yang diberikan.context (misalnya untuk mengakses nilai konteks). Agar mereka dapat bekerja dengan baik, Anda perlu meneruskan konteks ke semua panggilan logger. Opsi context-only menyebabkan sloglint melaporkan penggunaan metode tanpa konteks:
slog . Info ( "a user has logged in" ) // sloglint: InfoContext should be used instead Nilai -nilai yang mungkin adalah all (laporkan semua panggilan tanpa konteks) dan scope (laporkan hanya jika ada konteks dalam ruang lingkup fungsi terluar).
Untuk mendapatkan hasil maksimal dari penebangan terstruktur, Anda mungkin ingin meminta pesan log menjadi statis. Opsi static-msg menyebabkan sloglint melaporkan pesan non-statis:
slog . Info ( fmt . Sprintf ( "a user with id %d has logged in" , 42 )) // sloglint: message should be a string literal or a constantLaporan dapat diperbaiki dengan memindahkan nilai dinamis ke argumen:
slog . Info ( "a user has logged in" , "user_id" , 42 ) Untuk mencegah kesalahan ketik, Anda mungkin ingin melarang penggunaan kunci mentah sama sekali. Opsi no-raw-keys menyebabkan sloglint melaporkan penggunaan string sebagai kunci (termasuk panggilan slog.Attr , misalnya slog.Int("user_id", 42) ):
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: raw keys should not be usedLaporan ini dapat diperbaiki dengan menggunakan konstanta ...
const UserId = "user_id"
slog . Info ( "a user has logged in" , UserId , 42 ) ... atau konstruktor slog.Attr kustom:
func UserId ( value int ) slog. Attr { return slog . Int ( "user_id" , value ) }
slog . Info ( "a user has logged in" , UserId ( 42 ))Tip
Pembantu semacam itu dapat secara otomatis dihasilkan untuk Anda oleh alat sloggen . Cobalah juga!
Untuk memastikan konsistensi dalam log, Anda mungkin ingin menegakkan konvensi penamaan kunci tunggal. Opsi key-naming-case menyebabkan sloglint melaporkan kunci yang ditulis dalam kasus selain yang diberikan:
slog . Info ( "a user has logged in" , "user-id" , 42 ) // sloglint: keys should be written in snake_case Nilai yang mungkin adalah snake , kebab , camel , atau pascal .
Untuk mencegah penggunaan kunci log yang dipesan secara tidak sengaja, Anda mungkin ingin melarang kunci spesifik sama sekali. Opsi forbidden-keys menyebabkan sloglint melaporkan penggunaan kunci terlarang:
slog . Info ( "a user has logged in" , "reserved" , 42 ) // sloglint: "reserved" key is forbidden and should not be used Misalnya, saat menggunakan slog.JSONHandler standar.jsonhandler dan slog.TextHandler , Anda mungkin ingin melarang time , level , msg , dan kunci source , karena ini digunakan oleh penangan.
Untuk meningkatkan keterbacaan kode, Anda mungkin ingin meletakkan argumen pada baris yang terpisah, terutama saat menggunakan pasangan nilai kunci. Opsi args-on-sep-lines menyebabkan sloglint melaporkan 2+ argumen pada baris yang sama:
slog . Info ( "a user has logged in" , "user_id" , 42 , "ip_address" , "192.0.2.0" ) // sloglint: arguments should be put on separate linesLaporan ini dapat diperbaiki dengan memformat ulang kode:
slog . Info ( "a user has logged in" ,
"user_id" , 42 ,
"ip_address" , "192.0.2.0" ,
)