Um linhador GO que garante estilo de código consistente ao usar log/slog .
A API log/slog permite dois tipos diferentes de argumentos: pares e atributos de valor-chave. Embora as pessoas possam ter opiniões diferentes sobre qual é melhor, a maioria parece concordar com uma coisa: deve ser consistente. Com sloglint você pode aplicar várias regras para log/slog com base no seu estilo de código preferido.
sloglint é integrado ao golangci-lint , e esta é a maneira recomendada de usá-lo.
Para ativar o linhador, adicione as seguintes linhas a .golangci.yml :
linters :
enable :
- sloglint Como alternativa, você pode baixar um binário pré -construído na página de lançamentos para usar sloglint Standalone.
Execute golangci-lint com sloglint ativado. Consulte a lista de opções disponíveis para configurar o Linter.
Ao usar sloglint Standalone, passe as opções como sinalizadores com o mesmo nome.
A opção no-mixed-args faz com que sloglint relate pares e atributos de valores-chave de mistura em uma única chamada de função:
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 mixedEstá ativado por padrão.
A opção kv-only faz com que sloglint relate qualquer uso de atributos:
slog . Info ( "a user has logged in" , slog . Int ( "user_id" , 42 )) // sloglint: attributes should not be used Por outro lado, a opção attr-only faz com que sloglint relate qualquer uso de pares de valor-chave:
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: key-value pairs should not be used Alguns projetos preferem passar os madeireiros como dependências explícitas. A opção no-global faz com que sloglint relate o uso de madeireiros globais.
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: global logger should not be used Os valores possíveis são all (relate todos os madeireiros globais) e default (relate apenas o logger slog padrão).
Algumas implementações slog.Handler usam o context.Context (por exemplo, para acessar valores de contexto). Para que eles funcionem corretamente, você precisa passar um contexto para todas as chamadas de madeireira. A opção context-only faz com que sloglint relate o uso de métodos sem contexto:
slog . Info ( "a user has logged in" ) // sloglint: InfoContext should be used instead Valores possíveis são all (relate todas as chamadas sem contexto) e scope (relate apenas se existir um contexto no escopo da função mais externa).
Para tirar o máximo proveito do registro estruturado, você pode exigir que as mensagens de log sejam estáticas. A opção static-msg faz com que sloglint relate mensagens não estáticas:
slog . Info ( fmt . Sprintf ( "a user with id %d has logged in" , 42 )) // sloglint: message should be a string literal or a constantO relatório pode ser corrigido movendo valores dinâmicos para argumentos:
slog . Info ( "a user has logged in" , "user_id" , 42 ) Para evitar erros de digitação, você pode proibir o uso de teclas cruas completamente. A opção no-raw-keys faz com que sloglint relate o uso de strings como chaves (incluindo chamadas de slog.Attr , por exemplo, slog.Int("user_id", 42) ):
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: raw keys should not be usedEste relatório pode ser corrigido usando as constantes ...
const UserId = "user_id"
slog . Info ( "a user has logged in" , UserId , 42 ) ... ou construtores slog.Attr personalizado:
func UserId ( value int ) slog. Attr { return slog . Int ( "user_id" , value ) }
slog . Info ( "a user has logged in" , UserId ( 42 ))Dica
Esses ajudantes podem ser gerados automaticamente para você pela ferramenta sloggen . Experimente também!
Para garantir a consistência nos logs, você pode aplicar uma única convenção de nomeação de chaves. A opção de key-naming-case faz com que sloglint relate as chaves escritas em um caso que não seja o dado:
slog . Info ( "a user has logged in" , "user-id" , 42 ) // sloglint: keys should be written in snake_case Valores possíveis são snake , kebab , camel ou pascal .
Para evitar o uso acidental de teclas de log reservadas, você pode proibir as chaves específicas completamente. A opção forbidden-keys faz com que sloglint relate o uso de chaves proibidas:
slog . Info ( "a user has logged in" , "reserved" , 42 ) // sloglint: "reserved" key is forbidden and should not be used Por exemplo, ao usar o slog.JSONHandler e slog.TextHandler , você pode proibir o time , level , msg e as teclas source , como são usados pelos manipuladores.
Para melhorar a legibilidade do código, você pode colocar argumentos em linhas separadas, especialmente ao usar pares de valor-chave. A opção args-on-sep-lines faz com que sloglint relate mais 2 argumentos na mesma linha:
slog . Info ( "a user has logged in" , "user_id" , 42 , "ip_address" , "192.0.2.0" ) // sloglint: arguments should be put on separate linesEste relatório pode ser corrigido reformatando o código:
slog . Info ( "a user has logged in" ,
"user_id" , 42 ,
"ip_address" , "192.0.2.0" ,
)