Un enlace GO que garantiza un estilo de código constante al usar log/slog .
La API log/slog permite dos tipos diferentes de argumentos: pares de valores clave y atributos. Si bien las personas pueden tener diferentes opiniones sobre cuáles es mejor, la mayoría parece estar de acuerdo en una cosa: debería ser consistente. Con sloglint puede hacer cumplir varias reglas para log/slog en función de su estilo de código preferido.
sloglint está integrado en golangci-lint , y esta es la forma recomendada de usarlo.
Para habilitar el enlace, agregue las siguientes líneas a .golangci.yml :
linters :
enable :
- sloglint Alternativamente, puede descargar un binario prebuilado de la página de versiones para usar sloglint Standalone.
Ejecute golangci-lint con sloglint habilitado. Consulte la lista de opciones disponibles para configurar el enlace.
Cuando use sloglint Standalone, pase las opciones como banderas del mismo nombre.
La opción no-mixed-args hace que sloglint informe a mezclar pares de valores clave y atributos dentro de una llamada de función única:
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á habilitado de forma predeterminada.
La opción kv-only hace que sloglint informe cualquier uso de los atributos:
slog . Info ( "a user has logged in" , slog . Int ( "user_id" , 42 )) // sloglint: attributes should not be used Por el contrario, la opción attr-only hace que sloglint informe cualquier uso de pares de valor clave:
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: key-value pairs should not be used Algunos proyectos prefieren pasar registradores como dependencias explícitas. La opción no-global hace que sloglint informe el uso de registradores globales.
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: global logger should not be used Los valores posibles son all (informar todos los registradores globales) y default (informe solo el registrador slog predeterminado).
Algunas implementaciones slog.Handler hacen uso del context.Context dado. Para que funcionen correctamente, debe pasar un contexto a todas las llamadas de registrador. La opción context-only hace que sloglint informe el uso de métodos sin un contexto:
slog . Info ( "a user has logged in" ) // sloglint: InfoContext should be used instead Los valores posibles son all (informar todas las llamadas sin contexto) y scope (informe solo si existe un contexto en el alcance de la función más externa).
Para aprovechar al máximo el registro estructurado, es posible que desee requerir que los mensajes de registro sean estáticos. La opción static-msg hace que sloglint informe mensajes no estáticos:
slog . Info ( fmt . Sprintf ( "a user with id %d has logged in" , 42 )) // sloglint: message should be a string literal or a constantEl informe se puede solucionar moviendo valores dinámicos a los argumentos:
slog . Info ( "a user has logged in" , "user_id" , 42 ) Para evitar errores tipográficos, es posible que desee prohibir el uso de claves crudas por completo. La opción no-raw-keys hace que sloglint informe el uso de cadenas como claves (incluidas las llamadas slog.Attr , por ejemplo slog.Int("user_id", 42) ):
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: raw keys should not be usedEste informe se puede solucionar usando cualquiera de las constantes ...
const UserId = "user_id"
slog . Info ( "a user has logged in" , UserId , 42 ) ... o Slog slog.Attr Constructores:
func UserId ( value int ) slog. Attr { return slog . Int ( "user_id" , value ) }
slog . Info ( "a user has logged in" , UserId ( 42 ))Consejo
Dichos ayudantes pueden ser generados automáticamente para usted por la herramienta sloggen . ¡Pruébalo también!
Para garantizar la consistencia en los registros, es posible que desee hacer cumplir una convención de nomenclatura de llave única. La opción key-naming-case hace que sloglint informe las claves escritas en un caso que no sea el dado:
slog . Info ( "a user has logged in" , "user-id" , 42 ) // sloglint: keys should be written in snake_case Los valores posibles son snake , kebab , camel o pascal .
Para evitar el uso accidental de las claves de registro reservadas, es posible que desee prohibir las claves específicas por completo. La opción forbidden-keys hace que sloglint informe el uso de claves prohibidas:
slog . Info ( "a user has logged in" , "reserved" , 42 ) // sloglint: "reserved" key is forbidden and should not be used Por ejemplo, cuando se usa el slog.JSONHandler estándar y slog.TextHandler , es posible que desee prohibir el time , level , msg y las claves source , ya que los controladores usan.
Para mejorar la legibilidad del código, es posible que desee poner argumentos en líneas separadas, especialmente cuando se usa pares de valor clave. La opción args-on-sep-lines hace que sloglint reporte 2+ argumentos en la misma línea:
slog . Info ( "a user has logged in" , "user_id" , 42 , "ip_address" , "192.0.2.0" ) // sloglint: arguments should be put on separate linesEste informe se puede solucionar reformatando el código:
slog . Info ( "a user has logged in" ,
"user_id" , 42 ,
"ip_address" , "192.0.2.0" ,
)