feat: rename logrlint to loggercheck (#3144)

This commit is contained in:
Timon Wong 2022-09-07 05:23:32 +08:00 committed by GitHub
parent 19a338706a
commit 3a2ad9083a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 454 additions and 37 deletions

View File

@ -1119,6 +1119,32 @@ linters-settings:
# Default: 1
tab-width: 1
loggercheck:
# Allow check for the github.com/go-kit/log library.
# Default: true
kitlog: false
# Allow check for the k8s.io/klog/v2 library.
# Default: true
klog: false
# Allow check for the github.com/go-logr/logr library.
# Default: true
logr: false
# Allow check for the "sugar logger" from go.uber.org/zap library.
# Default: true
zap: false
# Require all logging keys to be inlined constant strings.
# Default: false
require-string-key: true
# Require printf-like format specifier (%s, %d for example) not present.
# Default: false
no-printf-like: true
# List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.
# For example: https://github.com/timonwong/loggercheck/blob/7395ab86595781e33f7afba27ad7b55e6956ebcd/testdata/custom-rules.txt
# Default: empty
rules:
- k8s.io/klog/v2.InfoS # package level exported functions
- (github.com/go-logr/logr.Logger).Error # "Methods"
- (*go.uber.org/zap.SugaredLogger).With # Also "Methods", but with a pointer receiver
maintidx:
# Show functions with maintainability index lower than N.
# A high index indicates better maintainability (it's kind of the opposite of complexity).
@ -1956,7 +1982,7 @@ linters:
- interfacer
- ireturn
- lll
- logrlint
- loggercheck
- maintidx
- makezero
- maligned
@ -2061,7 +2087,7 @@ linters:
- interfacer
- ireturn
- lll
- logrlint
- loggercheck
- maintidx
- makezero
- maligned

2
go.mod
View File

@ -95,7 +95,7 @@ require (
github.com/tdakkota/asciicheck v0.1.1
github.com/tetafro/godot v1.4.11
github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144
github.com/timonwong/logrlint v0.1.0
github.com/timonwong/loggercheck v0.9.3
github.com/tomarrell/wrapcheck/v2 v2.6.2
github.com/tommy-muehle/go-mnd/v2 v2.5.0
github.com/ultraware/funlen v0.0.3

8
go.sum generated
View File

@ -531,8 +531,12 @@ github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw=
github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8=
github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 h1:kl4KhGNsJIbDHS9/4U9yQo1UcPQM0kOMJHn29EoH/Ro=
github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
github.com/timonwong/logrlint v0.1.0 h1:phZCcypL/vtx6cGxObJgWZ5wexZF5SXFPLOM+ru0e/M=
github.com/timonwong/logrlint v0.1.0/go.mod h1:Zleg4Gw+kRxNej+Ra7o+tEaW5k1qthTaYKU7rSD39LU=
github.com/timonwong/loggercheck v0.9.1 h1:7HrqjZzIWiSsAI1kO/LHqpEVHvBOOeiZ68XGQCU/WqY=
github.com/timonwong/loggercheck v0.9.1/go.mod h1:wUqnk9yAOIKtGA39l1KLE9Iz0QiTocu/YZoOf+OzFdw=
github.com/timonwong/loggercheck v0.9.2 h1:KrR/4yWGJcwulKPtlOyVCbgl/uckJMSMiCAzcv4OGx0=
github.com/timonwong/loggercheck v0.9.2/go.mod h1:wUqnk9yAOIKtGA39l1KLE9Iz0QiTocu/YZoOf+OzFdw=
github.com/timonwong/loggercheck v0.9.3 h1:ecACo9fNiHxX4/Bc02rW2+kaJIAMAes7qJ7JKxt0EZI=
github.com/timonwong/loggercheck v0.9.3/go.mod h1:wUqnk9yAOIKtGA39l1KLE9Iz0QiTocu/YZoOf+OzFdw=
github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw=
github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o=

View File

@ -69,6 +69,15 @@ var defaultLintersSettings = LintersSettings{
LineLength: 120,
TabWidth: 1,
},
LoggerCheck: LoggerCheckSettings{
Kitlog: true,
Klog: true,
Logr: true,
Zap: true,
RequireStringKey: false,
NoPrintfLike: false,
Rules: nil,
},
MaintIdx: MaintIdxSettings{
Under: 20,
},
@ -157,6 +166,7 @@ type LintersSettings struct {
InterfaceBloat InterfaceBloatSettings
Ireturn IreturnSettings
Lll LllSettings
LoggerCheck LoggerCheckSettings
MaintIdx MaintIdxSettings
Makezero MakezeroSettings
Maligned MalignedSettings
@ -479,6 +489,16 @@ type LllSettings struct {
TabWidth int `mapstructure:"tab-width"`
}
type LoggerCheckSettings struct {
Kitlog bool `mapstructure:"kitlog"`
Klog bool `mapstructure:"klog"`
Logr bool `mapstructure:"logr"`
Zap bool `mapstructure:"zap"`
RequireStringKey bool `mapstructure:"require-string-key"`
NoPrintfLike bool `mapstructure:"no-printf-like"`
Rules []string `mapstructure:"rules"`
}
type MaintIdxSettings struct {
Under int `mapstructure:"under"`
}

View File

@ -0,0 +1,44 @@
package golinters
import (
"github.com/timonwong/loggercheck"
"golang.org/x/tools/go/analysis"
"github.com/golangci/golangci-lint/pkg/config"
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
)
func NewLoggerCheck(settings *config.LoggerCheckSettings) *goanalysis.Linter {
var opts []loggercheck.Option
if settings != nil {
var disable []string
if !settings.Kitlog {
disable = append(disable, "kitlog")
}
if !settings.Klog {
disable = append(disable, "klog")
}
if !settings.Logr {
disable = append(disable, "logr")
}
if !settings.Zap {
disable = append(disable, "zap")
}
opts = []loggercheck.Option{
loggercheck.WithDisable(disable),
loggercheck.WithRequireStringKey(settings.RequireStringKey),
loggercheck.WithRules(settings.Rules),
loggercheck.WithNoPrintfLike(settings.NoPrintfLike),
}
}
analyzer := loggercheck.NewAnalyzer(opts...)
return goanalysis.NewLinter(
analyzer.Name,
analyzer.Doc,
[]*analysis.Analyzer{analyzer},
nil,
).WithLoadMode(goanalysis.LoadModeTypesInfo)
}

View File

@ -1,19 +0,0 @@
package golinters
import (
"github.com/timonwong/logrlint"
"golang.org/x/tools/go/analysis"
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
)
func NewLogrLint() *goanalysis.Linter {
a := logrlint.Analyzer
return goanalysis.NewLinter(
a.Name,
a.Doc,
[]*analysis.Analyzer{a},
nil,
).WithLoadMode(goanalysis.LoadModeTypesInfo)
}

View File

@ -140,6 +140,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
interfaceBloatCfg *config.InterfaceBloatSettings
ireturnCfg *config.IreturnSettings
lllCfg *config.LllSettings
loggerCheckCfg *config.LoggerCheckSettings
maintIdxCfg *config.MaintIdxSettings
makezeroCfg *config.MakezeroSettings
malignedCfg *config.MalignedSettings
@ -214,6 +215,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
interfaceBloatCfg = &m.cfg.LintersSettings.InterfaceBloat
ireturnCfg = &m.cfg.LintersSettings.Ireturn
lllCfg = &m.cfg.LintersSettings.Lll
loggerCheckCfg = &m.cfg.LintersSettings.LoggerCheck
maintIdxCfg = &m.cfg.LintersSettings.MaintIdx
makezeroCfg = &m.cfg.LintersSettings.Makezero
malignedCfg = &m.cfg.LintersSettings.Maligned
@ -583,11 +585,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithSince("v1.8.0").
WithPresets(linter.PresetStyle),
linter.NewConfig(golinters.NewLogrLint()).
linter.NewConfig(golinters.NewLoggerCheck(loggerCheckCfg)).
WithSince("v1.49.0").
WithLoadForGoAnalysis().
WithPresets(linter.PresetBugs).
WithURL("https://github.com/timonwong/logrlint"),
WithPresets(linter.PresetStyle, linter.PresetBugs).
WithAlternativeNames("logrlint").
WithURL("https://github.com/timonwong/loggercheck"),
linter.NewConfig(golinters.NewMaintIdx(maintIdxCfg)).
WithSince("v1.44.0").

View File

@ -29,7 +29,7 @@ func TestTypecheck(t *testing.T) {
func TestSourcesFromTestdataSubDir(t *testing.T) {
subDirs := []string{
"logrlint",
"loggercheck",
}
for _, dir := range subDirs {

View File

@ -0,0 +1,13 @@
linters-settings:
loggercheck:
rules:
- (*command-line-arguments.Logger).Debugw
- (*command-line-arguments.Logger).Infow
- (*command-line-arguments.Logger).Warnw
- (*command-line-arguments.Logger).Errorw
- (*command-line-arguments.Logger).With
- command-line-arguments.Debugw
- command-line-arguments.Infow
- command-line-arguments.Warnw
- command-line-arguments.Errorw
- command-line-arguments.With

View File

@ -0,0 +1,6 @@
linters-settings:
loggercheck:
kitlog: true
klog: false
logr: false
zap: false

View File

@ -0,0 +1,5 @@
linters-settings:
loggercheck:
logr: true
klog: false
zap: false

View File

@ -0,0 +1,3 @@
linters-settings:
loggercheck:
no-printf-like: true

View File

@ -0,0 +1,3 @@
linters-settings:
loggercheck:
require-string-key: true

View File

@ -0,0 +1,5 @@
linters-settings:
loggercheck:
logr: false
klog: false
zap: true

16
test/testdata/loggercheck/go.mod vendored Normal file
View File

@ -0,0 +1,16 @@
module loggercheck
go 1.19
require (
github.com/go-kit/log v0.2.1
github.com/go-logr/logr v1.2.3
go.uber.org/zap v1.23.0
k8s.io/klog/v2 v2.70.1
)
require (
github.com/go-logfmt/logfmt v0.5.1 // indirect
go.uber.org/atomic v1.10.0 // indirect
go.uber.org/multierr v1.8.0 // indirect
)

32
test/testdata/loggercheck/go.sum generated vendored Normal file
View File

@ -0,0 +1,32 @@
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=
go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ=
k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=

View File

@ -0,0 +1,118 @@
//golangcitest:args -Eloggercheck
//golangcitest:config_path configs/loggercheck_custom.yml
package loggercheck
import (
"errors"
"go.uber.org/zap"
)
var l = New()
type Logger struct {
s *zap.SugaredLogger
}
func New() *Logger {
logger := zap.NewExample().Sugar()
return &Logger{s: logger}
}
func (l *Logger) With(keysAndValues ...interface{}) *Logger {
return &Logger{
s: l.s.With(keysAndValues...),
}
}
func (l *Logger) Debugw(msg string, keysAndValues ...interface{}) {
l.s.Debugw(msg, keysAndValues...)
}
func (l *Logger) Infow(msg string, keysAndValues ...interface{}) {
l.s.Infow(msg, keysAndValues...)
}
func (l *Logger) Warnw(msg string, keysAndValues ...interface{}) {
l.s.Warnw(msg, keysAndValues...)
}
func (l *Logger) Errorw(msg string, keysAndValues ...interface{}) {
l.s.Errorw(msg, keysAndValues...)
}
func (l *Logger) Fatalw(msg string, keysAndValues ...interface{}) {
l.s.Fatalw(msg, keysAndValues...)
}
func (l *Logger) Sync() error {
return l.s.Sync()
}
// package level wrap func
func With(keysAndValues ...interface{}) *Logger {
return &Logger{
s: l.s.With(keysAndValues...),
}
}
func Debugw(msg string, keysAndValues ...interface{}) {
l.s.Debugw(msg, keysAndValues...)
}
func Infow(msg string, keysAndValues ...interface{}) {
l.s.Infow(msg, keysAndValues...)
}
func Warnw(msg string, keysAndValues ...interface{}) {
l.s.Warnw(msg, keysAndValues...)
}
func Errorw(msg string, keysAndValues ...interface{}) {
l.s.Errorw(msg, keysAndValues...)
}
func Fatalw(msg string, keysAndValues ...interface{}) {
l.s.Fatalw(msg, keysAndValues...)
}
func Sync() error {
return l.s.Sync()
}
func ExampleCustomLogger() {
err := errors.New("example error")
// custom SugaredLogger
log := New()
defer log.Sync()
log.Infow("abc", "key1", "value1")
log.Infow("abc", "key1", "value1", "key2") // want `odd number of arguments passed as key-value pairs for logging`
log.Errorw("message", "err", err, "key1", "value1")
log.Errorw("message", err, "key1", "value1", "key2", "value2") // want `odd number of arguments passed as key-value pairs for logging`
// with test
log.With("with_key1", "with_value1").Infow("message", "key1", "value1")
log.With("with_key1", "with_value1").Infow("message", "key1", "value1", "key2") // want `odd number of arguments passed as key-value pairs for logging`
log.With("with_key1").Infow("message", "key1", "value1") // want `odd number of arguments passed as key-value pairs for logging`
}
func ExampleCustomLoggerPackageLevelFunc() {
err := errors.New("example error")
defer Sync()
Infow("abc", "key1", "value1")
Infow("abc", "key1", "value1", "key2") // want `odd number of arguments passed as key-value pairs for logging`
Errorw("message", "err", err, "key1", "value1")
Errorw("message", err, "key1", "value1", "key2", "value2") // want `odd number of arguments passed as key-value pairs for logging`
// with test
With("with_key1", "with_value1").Infow("message", "key1", "value1")
With("with_key1", "with_value1").Infow("message", "key1", "value1", "key2") // want `odd number of arguments passed as key-value pairs for logging`
With("with_key1").Infow("message", "key1", "value1") // want `odd number of arguments passed as key-value pairs for logging`
}

View File

@ -0,0 +1,28 @@
//golangcitest:args -Eloggercheck
package loggercheck
import (
"fmt"
"github.com/go-logr/logr"
"go.uber.org/zap"
"k8s.io/klog/v2"
)
func ExampleDefaultLogr() {
log := logr.Discard()
log = log.WithValues("key") // want `odd number of arguments passed as key-value pairs for logging`
log.Info("message", "key1", "value1", "key2", "value2", "key3") // want `odd number of arguments passed as key-value pairs for logging`
log.Error(fmt.Errorf("error"), "message", "key1", "value1", "key2") // want `odd number of arguments passed as key-value pairs for logging`
log.Error(fmt.Errorf("error"), "message", "key1", "value1", "key2", "value2")
}
func ExampleDefaultKlog() {
klog.InfoS("message", "key1") // want `odd number of arguments passed as key-value pairs for logging`
}
func ExampleZapSugarNotChecked() {
sugar := zap.NewExample().Sugar()
defer sugar.Sync()
sugar.Infow("message", "key1", "value1", "key2") // want `odd number of arguments passed as key-value pairs for logging`
}

View File

@ -0,0 +1,31 @@
//golangcitest:args -Eloggercheck
//golangcitest:config_path configs/loggercheck_kitlogonly.yml
package loggercheck
import (
kitlog "github.com/go-kit/log"
"github.com/go-logr/logr"
"go.uber.org/zap"
"k8s.io/klog/v2"
)
func ExampleKitLogOnly_NoLogr() {
log := logr.Discard()
log.Info("message", "key1", "value1", "key2", "value2", "key3")
klog.InfoS("message", "key1")
sugar := zap.NewExample().Sugar()
sugar.Infow("message", "key1", "value1", "key2")
sugar.Errorw("error message", "key1")
}
func ExampleKitLogOnly() {
logger := kitlog.NewNopLogger()
logger.Log("msg", "message", "key1", "value1")
logger.Log("msg") // want `odd number of arguments passed as key-value pairs for logging`
logger.Log("msg", "message", "key1") // want `odd number of arguments passed as key-value pairs for logging`
kitlog.With(logger, "key1", "value1").Log("msg", "message")
kitlog.With(logger, "key1").Log("msg", "message") // want `odd number of arguments passed as key-value pairs for logging`
}

View File

@ -0,0 +1,25 @@
//golangcitest:args -Eloggercheck
//golangcitest:config_path configs/loggercheck_logronly.yml
package loggercheck
import (
"fmt"
"github.com/go-logr/logr"
"go.uber.org/zap"
"k8s.io/klog/v2"
)
func ExampleLogrOnly() {
log := logr.Discard()
log.Info("message", "key1", "value1", "key2", "value2", "key3") // want `odd number of arguments passed as key-value pairs for logging`
klog.InfoS("message", "key1")
sugar := zap.NewExample().Sugar()
sugar.Infow("message", "key1", "value1", "key2")
sugar.Errorw("error message", "key1")
// Will not check by default (-requirestringkey)
log.Error(fmt.Errorf("error"), "message", []byte("key1"), "value1")
}

View File

@ -0,0 +1,15 @@
//golangcitest:args -Eloggercheck
//golangcitest:config_path configs/loggercheck_noprintflike.yml
package loggercheck
import (
"github.com/go-logr/logr"
)
func ExampleNoPrintfLike() {
log := logr.Discard()
log.Info("This message is ok")
log.Info("Should not contains printf like format specifiers: %s %d %w") // want `logging message should not use format specifier "%s"`
log.Info("It also checks for the key value pairs", "key", "value %.2f") // want `logging message should not use format specifier "%\.2f"`
}

View File

@ -0,0 +1,22 @@
//golangcitest:args -Eloggercheck
//golangcitest:config_path configs/loggercheck_requirestringkey.yml
package loggercheck
import (
"github.com/go-logr/logr"
)
func ExampleRequireStringKey() {
log := logr.Discard()
log.Info("message", "key1", "value1")
const key1 = "key1"
log.Info("message", key1, "value1")
key2 := []byte(key1)
log.Info("message", key2, "value2") // want `logging keys are expected to be inlined constant strings, please replace "key2" provided with string`
key3 := key1
log.Info("message", key3, "value3") // want `logging keys are expected to be inlined constant strings, please replace "key3" provided with string`
log.Info("message", "键1", "value1") // want `logging keys are expected to be alphanumeric strings, please remove any non-latin characters from "键1"`
}

View File

@ -0,0 +1,12 @@
//golangcitest:args -Eloggercheck
//golangcitest:config_path configs/loggercheck_zaponly.yml
package loggercheck
import "go.uber.org/zap"
func ExampleZapOnly() {
sugar := zap.NewExample().Sugar()
sugar.Infow("message", "key1", "value1", "key2") // want `odd number of arguments passed as key-value pairs for logging`
sugar.Errorw("error message", "key1") // want `odd number of arguments passed as key-value pairs for logging`
}

View File

@ -1,16 +1,28 @@
//golangcitest:args -Elogrlint
package logrlint
package loggercheck
import (
"fmt"
"github.com/go-logr/logr"
"go.uber.org/zap"
"k8s.io/klog/v2"
)
func Example() {
func ExampleLogrlintLogr() {
log := logr.Discard()
log = log.WithValues("key") // want `odd number of arguments passed as key-value pairs for logging`
log.Info("message", "key1", "value1", "key2", "value2", "key3") // want `odd number of arguments passed as key-value pairs for logging`
log.Error(fmt.Errorf("error"), "message", "key1", "value1", "key2") // want `odd number of arguments passed as key-value pairs for logging`
log.Error(fmt.Errorf("error"), "message", "key1", "value1", "key2", "value2")
}
func ExampleLogrlintKlog() {
klog.InfoS("message", "key1") // want `odd number of arguments passed as key-value pairs for logging`
}
func ExampleLogrlintZapSugar() {
sugar := zap.NewExample().Sugar()
defer sugar.Sync()
sugar.Infow("message", "key1", "value1", "key2") // want `odd number of arguments passed as key-value pairs for logging`
}

View File

@ -1,5 +0,0 @@
module logrlint
go 1.16
require github.com/go-logr/logr v1.2.3

2
test/testdata/logrlint/go.sum generated vendored
View File

@ -1,2 +0,0 @@
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=