diff --git a/.github/workflows/apidiff.yaml b/.github/workflows/apidiff.yaml index e653923..3cb7db8 100644 --- a/.github/workflows/apidiff.yaml +++ b/.github/workflows/apidiff.yaml @@ -11,20 +11,20 @@ jobs: if: github.base_ref steps: - name: Install Go - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: - go-version: 1.21.x + go-version: 1.24.x - name: Add GOBIN to PATH run: echo "PATH=$(go env GOPATH)/bin:$PATH" >>$GITHUB_ENV - name: Install dependencies - run: GO111MODULE=off go get golang.org/x/exp/cmd/apidiff + run: go install golang.org/x/exp/cmd/apidiff@latest - name: Checkout old code - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ github.base_ref }} path: "old" - name: Checkout new code - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: path: "new" - name: APIDiff diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index d69b256..d0bc3c1 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -10,14 +10,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Update Go - uses: actions/setup-go@v5.0.1 + uses: actions/setup-go@v5.5.0 with: go-version: '>=1.21.0' cache: false - name: Lint - uses: golangci/golangci-lint-action@a4f60bb28d35aeee14e6880718e0c85ff1882e64 # v6.0.1 + uses: golangci/golangci-lint-action@4afd733a84b1f43292c63897423277bb7f4313a9 # v8.0.0 with: # version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version version: latest diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 6ae7e2a..470b0c0 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -29,12 +29,12 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@dc50aa9510b46c811795eb24b2f1ba02a914e534 # v2.3.3 + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 with: results_file: results.sarif results_format: sarif @@ -51,7 +51,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: SARIF file path: results.sarif @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@b7cec7526559c32f1616476ff32d17ba4c59b2d6 # v3.25.5 + uses: github/codeql-action/upload-sarif@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 with: sarif_file: results.sarif diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 2c70bd4..cbaf938 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -9,16 +9,16 @@ jobs: test: strategy: matrix: - version: [ '1.18', '1.19', '1.20', '1.21.0-rc.4' ] + version: [ '1.18', '1.19', '1.20', '1.21', '1.22', '1.23', '1.24' ] platform: [ ubuntu-latest, macos-latest, windows-latest ] runs-on: ${{ matrix.platform }} steps: - name: Install Go - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: ${{ matrix.version }} - name: Checkout code - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Build run: go build -v ./... - name: Test diff --git a/.golangci.yaml b/.golangci.yaml index 0cffafa..0ed62c1 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,26 +1,28 @@ +version: "2" + run: timeout: 1m tests: true linters: - disable-all: true - enable: + default: none + enable: # please keep this alphabetized + - asasalint - asciicheck + - copyloopvar + - dupl - errcheck - forcetypeassert + - goconst - gocritic - - gofmt - - goimports - - gosimple - govet - ineffassign - misspell + - musttag - revive - staticcheck - - typecheck - unused issues: - exclude-use-default: false max-issues-per-linter: 0 max-same-issues: 10 diff --git a/benchmark/benchmark_slog_test.go b/benchmark/benchmark_slog_test.go index 6f115fd..7a47b7d 100644 --- a/benchmark/benchmark_slog_test.go +++ b/benchmark/benchmark_slog_test.go @@ -32,42 +32,42 @@ import ( // func BenchmarkSlogSinkLogInfoOneArg(b *testing.B) { - var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) + var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) //nolint:staticcheck doInfoOneArg(b, log) } func BenchmarkSlogSinkLogInfoSeveralArgs(b *testing.B) { - var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) + var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) //nolint:staticcheck doInfoSeveralArgs(b, log) } func BenchmarkSlogSinkLogInfoWithValues(b *testing.B) { - var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) + var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) //nolint:staticcheck doInfoWithValues(b, log) } func BenchmarkSlogSinkLogV0Info(b *testing.B) { - var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) + var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) //nolint:staticcheck doV0Info(b, log) } func BenchmarkSlogSinkLogV9Info(b *testing.B) { - var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) + var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) //nolint:staticcheck doV9Info(b, log) } func BenchmarkSlogSinkLogError(b *testing.B) { - var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) + var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) //nolint:staticcheck doError(b, log) } func BenchmarkSlogSinkWithValues(b *testing.B) { - var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) + var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) //nolint:staticcheck doWithValues(b, log) } func BenchmarkSlogSinkWithName(b *testing.B) { - var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) + var log logr.Logger = logr.FromSlogHandler(logr.ToSlogHandler(logr.Discard())) //nolint:staticcheck doWithName(b, log) } @@ -82,61 +82,61 @@ func makeSlogJSONLogger() logr.Logger { } func BenchmarkSlogJSONLogInfoOneArg(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doInfoOneArg(b, log) } func BenchmarkSlogJSONLogInfoSeveralArgs(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doInfoSeveralArgs(b, log) } func BenchmarkSlogJSONLogInfoWithValues(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doInfoWithValues(b, log) } func BenchmarkSlogJSONLogV0Info(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doV0Info(b, log) } func BenchmarkSlogJSONLogV9Info(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doV9Info(b, log) } func BenchmarkSlogJSONLogError(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doError(b, log) } func BenchmarkSlogJSONLogWithValues(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doWithValues(b, log) } func BenchmarkSlogJSONWithName(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doWithName(b, log) } func BenchmarkSlogJSONWithCallDepth(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doWithCallDepth(b, log) } func BenchmarkSlogJSONLogInfoStringerValue(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doStringerValue(b, log) } func BenchmarkSlogJSONLogInfoErrorValue(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doErrorValue(b, log) } func BenchmarkSlogJSONLogInfoMarshalerValue(b *testing.B) { - var log logr.Logger = makeSlogJSONLogger() + var log logr.Logger = makeSlogJSONLogger() //nolint:staticcheck doMarshalerValue(b, log) } diff --git a/benchmark/benchmark_test.go b/benchmark/benchmark_test.go index 35c7dd0..06553fc 100644 --- a/benchmark/benchmark_test.go +++ b/benchmark/benchmark_test.go @@ -146,42 +146,42 @@ func doMarshalerValue(b *testing.B, log logr.Logger) { // func BenchmarkDiscardLogInfoOneArg(b *testing.B) { - var log logr.Logger = logr.Discard() + var log logr.Logger = logr.Discard() //nolint:staticcheck doInfoOneArg(b, log) } func BenchmarkDiscardLogInfoSeveralArgs(b *testing.B) { - var log logr.Logger = logr.Discard() + var log logr.Logger = logr.Discard() //nolint:staticcheck doInfoSeveralArgs(b, log) } func BenchmarkDiscardLogInfoWithValues(b *testing.B) { - var log logr.Logger = logr.Discard() + var log logr.Logger = logr.Discard() //nolint:staticcheck doInfoWithValues(b, log) } func BenchmarkDiscardLogV0Info(b *testing.B) { - var log logr.Logger = logr.Discard() + var log logr.Logger = logr.Discard() //nolint:staticcheck doV0Info(b, log) } func BenchmarkDiscardLogV9Info(b *testing.B) { - var log logr.Logger = logr.Discard() + var log logr.Logger = logr.Discard() //nolint:staticcheck doV9Info(b, log) } func BenchmarkDiscardLogError(b *testing.B) { - var log logr.Logger = logr.Discard() + var log logr.Logger = logr.Discard() //nolint:staticcheck doError(b, log) } func BenchmarkDiscardWithValues(b *testing.B) { - var log logr.Logger = logr.Discard() + var log logr.Logger = logr.Discard() //nolint:staticcheck doWithValues(b, log) } func BenchmarkDiscardWithName(b *testing.B) { - var log logr.Logger = logr.Discard() + var log logr.Logger = logr.Discard() //nolint:staticcheck doWithName(b, log) } @@ -193,91 +193,91 @@ func noopKV(_, _ string) {} func noopJSON(_ string) {} func BenchmarkFuncrLogInfoOneArg(b *testing.B) { - var log logr.Logger = funcr.New(noopKV, funcr.Options{}) + var log logr.Logger = funcr.New(noopKV, funcr.Options{}) //nolint:staticcheck doInfoOneArg(b, log) } func BenchmarkFuncrJSONLogInfoOneArg(b *testing.B) { - var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) + var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) //nolint:staticcheck doInfoOneArg(b, log) } func BenchmarkFuncrLogInfoSeveralArgs(b *testing.B) { - var log logr.Logger = funcr.New(noopKV, funcr.Options{}) + var log logr.Logger = funcr.New(noopKV, funcr.Options{}) //nolint:staticcheck doInfoSeveralArgs(b, log) } func BenchmarkFuncrJSONLogInfoSeveralArgs(b *testing.B) { - var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) + var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) //nolint:staticcheck doInfoSeveralArgs(b, log) } func BenchmarkFuncrLogInfoWithValues(b *testing.B) { - var log logr.Logger = funcr.New(noopKV, funcr.Options{}) + var log logr.Logger = funcr.New(noopKV, funcr.Options{}) //nolint:staticcheck doInfoWithValues(b, log) } func BenchmarkFuncrJSONLogInfoWithValues(b *testing.B) { - var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) + var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) //nolint:staticcheck doInfoWithValues(b, log) } func BenchmarkFuncrLogV0Info(b *testing.B) { - var log logr.Logger = funcr.New(noopKV, funcr.Options{}) + var log logr.Logger = funcr.New(noopKV, funcr.Options{}) //nolint:staticcheck doV0Info(b, log) } func BenchmarkFuncrJSONLogV0Info(b *testing.B) { - var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) + var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) //nolint:staticcheck doV0Info(b, log) } func BenchmarkFuncrLogV9Info(b *testing.B) { - var log logr.Logger = funcr.New(noopKV, funcr.Options{}) + var log logr.Logger = funcr.New(noopKV, funcr.Options{}) //nolint:staticcheck doV9Info(b, log) } func BenchmarkFuncrJSONLogV9Info(b *testing.B) { - var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) + var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) //nolint:staticcheck doV9Info(b, log) } func BenchmarkFuncrLogError(b *testing.B) { - var log logr.Logger = funcr.New(noopKV, funcr.Options{}) + var log logr.Logger = funcr.New(noopKV, funcr.Options{}) //nolint:staticcheck doError(b, log) } func BenchmarkFuncrJSONLogError(b *testing.B) { - var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) + var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) //nolint:staticcheck doError(b, log) } func BenchmarkFuncrWithValues(b *testing.B) { - var log logr.Logger = funcr.New(noopKV, funcr.Options{}) + var log logr.Logger = funcr.New(noopKV, funcr.Options{}) //nolint:staticcheck doWithValues(b, log) } func BenchmarkFuncrWithName(b *testing.B) { - var log logr.Logger = funcr.New(noopKV, funcr.Options{}) + var log logr.Logger = funcr.New(noopKV, funcr.Options{}) //nolint:staticcheck doWithName(b, log) } func BenchmarkFuncrWithCallDepth(b *testing.B) { - var log logr.Logger = funcr.New(noopKV, funcr.Options{}) + var log logr.Logger = funcr.New(noopKV, funcr.Options{}) //nolint:staticcheck doWithCallDepth(b, log) } func BenchmarkFuncrJSONLogInfoStringerValue(b *testing.B) { - var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) + var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) //nolint:staticcheck doStringerValue(b, log) } func BenchmarkFuncrJSONLogInfoErrorValue(b *testing.B) { - var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) + var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) //nolint:staticcheck doErrorValue(b, log) } func BenchmarkFuncrJSONLogInfoMarshalerValue(b *testing.B) { - var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) + var log logr.Logger = funcr.NewJSON(noopJSON, funcr.Options{}) //nolint:staticcheck doMarshalerValue(b, log) } diff --git a/example_slogr_test.go b/example_slogr_test.go index 55bae82..7c370d1 100644 --- a/example_slogr_test.go +++ b/example_slogr_test.go @@ -55,9 +55,9 @@ func ExampleFromSlogHandler() { func ExampleToSlogHandler() { funcrLogger := funcr.New(func(prefix, args string) { if prefix != "" { - fmt.Fprintln(os.Stdout, prefix, args) + fmt.Println(prefix, args) } else { - fmt.Fprintln(os.Stdout, args) + fmt.Println(args) } }, funcr.Options{ Verbosity: 10, diff --git a/examples/tab_logger.go b/examples/tab_logger.go index 4e00598..76ccc79 100644 --- a/examples/tab_logger.go +++ b/examples/tab_logger.go @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Package main implements a simple example of a logr.LogSink that logs to +// stderr in a tabular format. It is not intended to be a production logger. package main import ( @@ -36,23 +38,23 @@ var _ logr.LogSink = &tabLogSink{} // Note that Init usually takes a pointer so it can modify the receiver to save // runtime info. -func (*tabLogSink) Init(info logr.RuntimeInfo) { +func (*tabLogSink) Init(_ logr.RuntimeInfo) { } -func (tabLogSink) Enabled(level int) bool { +func (tabLogSink) Enabled(_ int) bool { return true } -func (l tabLogSink) Info(level int, msg string, kvs ...any) { - fmt.Fprintf(l.writer, "%s\t%s\t", l.name, msg) +func (l tabLogSink) Info(_ int, msg string, kvs ...any) { + _, _ = fmt.Fprintf(l.writer, "%s\t%s\t", l.name, msg) for k, v := range l.keyValues { - fmt.Fprintf(l.writer, "%s: %+v ", k, v) + _, _ = fmt.Fprintf(l.writer, "%s: %+v ", k, v) } for i := 0; i < len(kvs); i += 2 { - fmt.Fprintf(l.writer, "%s: %+v ", kvs[i], kvs[i+1]) + _, _ = fmt.Fprintf(l.writer, "%s: %+v ", kvs[i], kvs[i+1]) } - fmt.Fprintf(l.writer, "\n") - l.writer.Flush() + _, _ = fmt.Fprintf(l.writer, "\n") + _ = l.writer.Flush() } func (l tabLogSink) Error(err error, msg string, kvs ...any) { @@ -74,7 +76,9 @@ func (l tabLogSink) WithValues(kvs ...any) logr.LogSink { newMap[k] = v } for i := 0; i < len(kvs); i += 2 { - newMap[kvs[i].(string)] = kvs[i+1] + k := kvs[i].(string) //nolint:forcetypeassert + v := kvs[i+1] + newMap[k] = v } return &tabLogSink{ name: l.name, diff --git a/examples/usage_example.go b/examples/usage_example.go index e60db7a..99d464d 100644 --- a/examples/usage_example.go +++ b/examples/usage_example.go @@ -51,7 +51,7 @@ var objectMap = map[string]Object{ }, } -// Object is an app contruct that might want to be logged. +// Object is an app construct that might want to be logged. type Object struct { Name string Kind string @@ -136,7 +136,7 @@ func (c *Controller) Run() { log.V(1).Info("reconciling object for key") // Do some complicated updates updates - obj.Details = obj.Details.(int) * 2 + obj.Details = obj.Details.(int) * 2 //nolint:forcetypeassert // actually save the updates log.V(1).Info("updating object", "details", obj.Details) diff --git a/funcr/example_formatter_test.go b/funcr/example_formatter_test.go index 474e510..0bac4bd 100644 --- a/funcr/example_formatter_test.go +++ b/funcr/example_formatter_test.go @@ -41,17 +41,17 @@ type stdoutlogger struct { } func (l stdoutlogger) WithName(name string) logr.LogSink { - l.Formatter.AddName(name) + l.AddName(name) return &l } func (l stdoutlogger) WithValues(kvList ...any) logr.LogSink { - l.Formatter.AddValues(kvList) + l.AddValues(kvList) return &l } func (l stdoutlogger) WithCallDepth(depth int) logr.LogSink { - l.Formatter.AddCallDepth(depth) + l.AddCallDepth(depth) return &l } diff --git a/funcr/example_test.go b/funcr/example_test.go index 4918154..c8e47a3 100644 --- a/funcr/example_test.go +++ b/funcr/example_test.go @@ -19,12 +19,11 @@ package funcr_test import ( "fmt" - "github.com/go-logr/logr" "github.com/go-logr/logr/funcr" ) func ExampleNew() { - var log logr.Logger = funcr.New(func(prefix, args string) { + log := funcr.New(func(prefix, args string) { fmt.Println(prefix, args) }, funcr.Options{}) @@ -35,7 +34,7 @@ func ExampleNew() { } func ExampleNewJSON() { - var log logr.Logger = funcr.NewJSON(func(obj string) { + log := funcr.NewJSON(func(obj string) { fmt.Println(obj) }, funcr.Options{}) @@ -46,7 +45,7 @@ func ExampleNewJSON() { } func ExampleUnderlier() { - var log logr.Logger = funcr.New(func(prefix, args string) { + log := funcr.New(func(prefix, args string) { fmt.Println(prefix, args) }, funcr.Options{}) @@ -58,7 +57,7 @@ func ExampleUnderlier() { } func ExampleOptions() { - var log logr.Logger = funcr.NewJSON( + log := funcr.NewJSON( func(obj string) { fmt.Println(obj) }, funcr.Options{ LogCaller: funcr.All, @@ -68,8 +67,8 @@ func ExampleOptions() { log.V(1).Info("V(1) message", "key", "value") log.V(2).Info("V(2) message", "key", "value") // Output: - // {"logger":"","caller":{"file":"example_test.go","line":67},"level":0,"msg":"V(0) message","key":"value"} - // {"logger":"","caller":{"file":"example_test.go","line":68},"level":1,"msg":"V(1) message","key":"value"} + // {"logger":"","caller":{"file":"example_test.go","line":66},"level":0,"msg":"V(0) message","key":"value"} + // {"logger":"","caller":{"file":"example_test.go","line":67},"level":1,"msg":"V(1) message","key":"value"} } func ExampleOptions_renderHooks() { @@ -87,7 +86,7 @@ func ExampleOptions_renderHooks() { return []any{"labels", funcr.PseudoStruct(kvList)} } - var log logr.Logger = funcr.NewJSON( + log := funcr.NewJSON( func(obj string) { fmt.Println(obj) }, funcr.Options{ RenderBuiltinsHook: prefixSpecialKeys, @@ -101,7 +100,7 @@ func ExampleOptions_renderHooks() { } func ExamplePseudoStruct() { - var log logr.Logger = funcr.NewJSON( + log := funcr.NewJSON( func(obj string) { fmt.Println(obj) }, funcr.Options{}) kv := []any{ @@ -119,7 +118,7 @@ func ExampleOptions_maxLogDepth() { l := List{} l.Next = &l // recursive - var log logr.Logger = funcr.NewJSON( + log := funcr.NewJSON( func(obj string) { fmt.Println(obj) }, funcr.Options{MaxLogDepth: 4}) log.Info("recursive", "list", l) diff --git a/funcr/funcr.go b/funcr/funcr.go index 30568e7..b22c57d 100644 --- a/funcr/funcr.go +++ b/funcr/funcr.go @@ -77,7 +77,7 @@ func newSink(fn func(prefix, args string), formatter Formatter) logr.LogSink { write: fn, } // For skipping fnlogger.Info and fnlogger.Error. - l.Formatter.AddCallDepth(1) + l.AddCallDepth(1) // via Formatter return l } @@ -164,17 +164,17 @@ type fnlogger struct { } func (l fnlogger) WithName(name string) logr.LogSink { - l.Formatter.AddName(name) + l.AddName(name) // via Formatter return &l } func (l fnlogger) WithValues(kvList ...any) logr.LogSink { - l.Formatter.AddValues(kvList) + l.AddValues(kvList) // via Formatter return &l } func (l fnlogger) WithCallDepth(depth int) logr.LogSink { - l.Formatter.AddCallDepth(depth) + l.AddCallDepth(depth) // via Formatter return &l } diff --git a/slogr_test.go b/slogr_test.go index 91b8302..939a053 100644 --- a/slogr_test.go +++ b/slogr_test.go @@ -114,20 +114,26 @@ func TestWithCallDepth(t *testing.T) { } } -func TestRunSlogTestsOnSlogHandlerLogSink(t *testing.T) { +func TestRunSlogTestsOnNaiveSlogHandler(t *testing.T) { // This proves that slogHandler passes slog's own tests when given a - // non-SlogSink LogSink. + // LogSink which does not implement SlogSink. exceptions := []string{ // logr sinks handle time themselves "a Handler should ignore a zero Record.Time", // slogHandler does not do groups "properly", so these all fail with // "missing group". It's looking for `"G":{"a":"b"}` and getting // `"G.a": "b"`. + // + // NOTE: These make a weird coupling to Go versions. Newer Go versions + // don't need some of these exceptions, but older ones do. It's unclear + // if that is because something changed in slog or if the test was + // removed. "a Handler should handle Group attributes", "a Handler should handle the WithGroup method", "a Handler should handle multiple WithGroup and WithAttr calls", "a Handler should not output groups for an empty Record", "a Handler should not output groups if there are no attributes", + "a Handler should not output nested groups if there are no attributes", "a Handler should call Resolve on attribute values in groups", "a Handler should call Resolve on attribute values in groups from WithAttrs", } @@ -136,21 +142,21 @@ func TestRunSlogTestsOnSlogHandlerLogSink(t *testing.T) { // or SlogSink (since those get special treatment). We can trust that // the slog JSONHandler works. handler := slog.NewJSONHandler(buffer, nil) - sink := &passthruLogSink{handler: handler} + sink := &passthruLogSink{handler: handler} // passthruLogSink does not implement SlogSink. logger := New(sink) return ToSlogHandler(logger) }, exceptions...) } -func TestRunSlogTestsOnSlogHandlerSlogSink(t *testing.T) { +func TestRunSlogTestsOnEnlightenedSlogHandler(t *testing.T) { // This proves that slogHandler passes slog's own tests when given a - // SlogSink. + // LogSink which implements SlogSink. exceptions := []string{} testhelp.RunSlogTests(t, func(buffer *bytes.Buffer) slog.Handler { // We want a known-good Logger that emits JSON and implements SlogSink, // to cover those paths. We can trust that the slog JSONHandler works. handler := slog.NewJSONHandler(buffer, nil) - sink := &passthruSlogSink{handler: handler} + sink := &passthruSlogSink{handler: handler} // passthruSlogSink implements SlogSink. logger := New(sink) return ToSlogHandler(logger) }, exceptions...) diff --git a/testr/testr.go b/testr/testr.go index 5eabe2b..28168e0 100644 --- a/testr/testr.go +++ b/testr/testr.go @@ -130,12 +130,12 @@ type testloggerInterface struct { } func (l testloggerInterface) WithName(name string) logr.LogSink { - l.Formatter.AddName(name) + l.AddName(name) // via Formatter return &l } func (l testloggerInterface) WithValues(kvList ...any) logr.LogSink { - l.Formatter.AddValues(kvList) + l.AddValues(kvList) // via Formatter return &l }