使用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" ,
)