From 6abadab4881e4af6d122332f6aef0365507c248a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 13:12:21 +0200 Subject: [PATCH 01/10] Bump github.com/rs/xid from 1.5.0 to 1.6.0 (#684) --- go.mod | 2 +- go.sum | 11 ++--------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 4385ff97..fd31c429 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,6 @@ require ( github.com/mattn/go-colorable v0.1.13 github.com/mattn/go-isatty v0.0.19 // indirect github.com/pkg/errors v0.9.1 - github.com/rs/xid v1.5.0 + github.com/rs/xid v1.6.0 golang.org/x/sys v0.12.0 // indirect ) diff --git a/go.sum b/go.sum index f2b8d847..c2bf72f1 100644 --- a/go.sum +++ b/go.sum @@ -1,22 +1,15 @@ github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= From 582f820cf0db2a9532afbb61570bec4e15ff2b1f Mon Sep 17 00:00:00 2001 From: Oleg Schwann Date: Thu, 14 Nov 2024 17:50:12 +0200 Subject: [PATCH 02/10] Get BasicSampler(0), RandomSampler(0), and BurstSampler(0) to behave the same and not write anything (#696) --- sampler.go | 3 +++ sampler_test.go | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/sampler.go b/sampler.go index 83ce2ed3..9207a730 100644 --- a/sampler.go +++ b/sampler.go @@ -47,6 +47,9 @@ type BasicSampler struct { // Sample implements the Sampler interface. func (s *BasicSampler) Sample(lvl Level) bool { n := s.N + if n == 0 { + return false + } if n == 1 { return true } diff --git a/sampler_test.go b/sampler_test.go index e42ad3a9..248bd301 100644 --- a/sampler_test.go +++ b/sampler_test.go @@ -28,6 +28,13 @@ var samplers = []struct { }, 100, 20, 20, }, + { + "BasicSampler_0", + func() Sampler { + return &BasicSampler{N: 0} + }, + 100, 0, 0, + }, { "RandomSampler", func() Sampler { @@ -35,6 +42,13 @@ var samplers = []struct { }, 100, 10, 30, }, + { + "RandomSampler_0", + func() Sampler { + return RandomSampler(0) + }, + 100, 0, 0, + }, { "BurstSampler", func() Sampler { @@ -42,6 +56,13 @@ var samplers = []struct { }, 100, 20, 20, }, + { + "BurstSampler_0", + func() Sampler { + return &BurstSampler{Burst: 0, Period: time.Second} + }, + 100, 0, 0, + }, { "BurstSamplerNext", func() Sampler { From 31e7995c5b60af4ba6ae1aa808a026f8cbf3b8cf Mon Sep 17 00:00:00 2001 From: Abdullah Alaadine <125296663+knbr13@users.noreply.github.com> Date: Fri, 27 Dec 2024 04:41:46 +0200 Subject: [PATCH 03/10] remove unnecessary nil checks (#701) Co-authored-by: Abdullah Alaadine --- console.go | 2 +- log.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/console.go b/console.go index 7e65e86f..5e00bb14 100644 --- a/console.go +++ b/console.go @@ -283,7 +283,7 @@ func (w ConsoleWriter) writeFields(evt map[string]interface{}, buf *bytes.Buffer func (w ConsoleWriter) writePart(buf *bytes.Buffer, evt map[string]interface{}, p string) { var f Formatter - if w.PartsExclude != nil && len(w.PartsExclude) > 0 { + if len(w.PartsExclude) > 0 { for _, exclude := range w.PartsExclude { if exclude == p { return diff --git a/log.go b/log.go index 6c1d4ead..ea2cd62b 100644 --- a/log.go +++ b/log.go @@ -494,7 +494,7 @@ func (l *Logger) newEvent(level Level, done func(string)) *Event { if level != NoLevel && LevelFieldName != "" { e.Str(LevelFieldName, LevelFieldMarshalFunc(level)) } - if l.context != nil && len(l.context) > 1 { + if len(l.context) > 1 { e.buf = enc.AppendObjectData(e.buf, l.context) } if l.stack { From 1869fa55bea5c09e93a06368c6a8756780dca5f7 Mon Sep 17 00:00:00 2001 From: sted Date: Sat, 4 Jan 2025 00:53:36 +0100 Subject: [PATCH 04/10] FormatPartValueByName for flexible custom formatting for ConsoleWriter (#541) --- README.md | 31 +++++++++++++++++++++++++++++++ console.go | 23 +++++++++++++++++++---- console_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1306a6c1..9d4e8e8d 100644 --- a/README.md +++ b/README.md @@ -366,6 +366,37 @@ log.Info().Str("foo", "bar").Msg("Hello World") // Output: 2006-01-02T15:04:05Z07:00 | INFO | ***Hello World**** foo:BAR ``` +To use custom advanced formatting: + +```go +output := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: true, + PartsOrder: []string{"level", "one", "two", "three", "message"}, + FieldsExclude: []string{"one", "two", "three"}} +output.FormatLevel = func(i interface{}) string { return strings.ToUpper(fmt.Sprintf("%-6s", i)) } +output.FormatFieldName = func(i interface{}) string { return fmt.Sprintf("%s:", i) } +output.FormatPartValueByName = func(i interface{}, s string) string { + var ret string + switch s { + case "one": + ret = strings.ToUpper(fmt.Sprintf("%s", i)) + case "two": + ret = strings.ToLower(fmt.Sprintf("%s", i)) + case "three": + ret = strings.ToLower(fmt.Sprintf("(%s)", i)) + } + return ret +} +log := zerolog.New(output) + +log.Info().Str("foo", "bar"). + Str("two", "TEST_TWO"). + Str("one", "test_one"). + Str("three", "test_three"). + Msg("Hello World") + +// Output: INFO TEST_ONE test_two (test_three) Hello World foo:bar +``` + ### Sub dictionary ```go diff --git a/console.go b/console.go index 5e00bb14..6c881ef6 100644 --- a/console.go +++ b/console.go @@ -47,6 +47,10 @@ const ( // Formatter transforms the input into a formatted string. type Formatter func(interface{}) string +// FormatterByFieldName transforms the input into a formatted string, +// being able to differentiate formatting based on field name. +type FormatterByFieldName func(interface{}, string) string + // ConsoleWriter parses the JSON input and writes it in an // (optionally) colorized, human-friendly format to Out. type ConsoleWriter struct { @@ -85,6 +89,9 @@ type ConsoleWriter struct { FormatFieldValue Formatter FormatErrFieldName Formatter FormatErrFieldValue Formatter + // If this is configured it is used for "part" values and + // has precedence on FormatFieldValue + FormatPartValueByName FormatterByFieldName FormatExtra func(map[string]interface{}, *bytes.Buffer) error @@ -282,6 +289,7 @@ func (w ConsoleWriter) writeFields(evt map[string]interface{}, buf *bytes.Buffer // writePart appends a formatted part to buf. func (w ConsoleWriter) writePart(buf *bytes.Buffer, evt map[string]interface{}, p string) { var f Formatter + var fvn FormatterByFieldName if len(w.PartsExclude) > 0 { for _, exclude := range w.PartsExclude { @@ -317,14 +325,21 @@ func (w ConsoleWriter) writePart(buf *bytes.Buffer, evt map[string]interface{}, f = w.FormatCaller } default: - if w.FormatFieldValue == nil { - f = consoleDefaultFormatFieldValue - } else { + if w.FormatPartValueByName != nil { + fvn = w.FormatPartValueByName + } else if w.FormatFieldValue != nil { f = w.FormatFieldValue + } else { + f = consoleDefaultFormatFieldValue } } - var s = f(evt[p]) + var s string + if f == nil { + s = fvn(evt[p], p) + } else { + s = f(evt[p]) + } if len(s) > 0 { if buf.Len() > 0 { diff --git a/console_test.go b/console_test.go index 179dfeef..8490c9e7 100644 --- a/console_test.go +++ b/console_test.go @@ -30,6 +30,34 @@ func ExampleConsoleWriter_customFormatters() { // Output: INFO | Hello World foo:BAR } +func ExampleConsoleWriter_partValueFormatter() { + out := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: true, + PartsOrder: []string{"level", "one", "two", "three", "message"}, + FieldsExclude: []string{"one", "two", "three"}} + out.FormatLevel = func(i interface{}) string { return strings.ToUpper(fmt.Sprintf("%-6s", i)) } + out.FormatFieldName = func(i interface{}) string { return fmt.Sprintf("%s:", i) } + out.FormatPartValueByName = func(i interface{}, s string) string { + var ret string + switch s { + case "one": + ret = strings.ToUpper(fmt.Sprintf("%s", i)) + case "two": + ret = strings.ToLower(fmt.Sprintf("%s", i)) + case "three": + ret = strings.ToLower(fmt.Sprintf("(%s)", i)) + } + return ret + } + log := zerolog.New(out) + + log.Info().Str("foo", "bar"). + Str("two", "TEST_TWO"). + Str("one", "test_one"). + Str("three", "test_three"). + Msg("Hello World") + // Output: INFO TEST_ONE test_two (test_three) Hello World foo:bar +} + func ExampleNewConsoleWriter() { out := zerolog.NewConsoleWriter() out.NoColor = true // For testing purposes only From 039860087ce1099876fb1f03a069a9feaa9cbefe Mon Sep 17 00:00:00 2001 From: crazy-pe <168214728+crazy-pe@users.noreply.github.com> Date: Wed, 26 Feb 2025 16:21:09 +0100 Subject: [PATCH 05/10] fix: reset condition in burst sampler (#711) (#712) --- sampler.go | 2 +- sampler_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/sampler.go b/sampler.go index 9207a730..19e04bd4 100644 --- a/sampler.go +++ b/sampler.go @@ -90,7 +90,7 @@ func (s *BurstSampler) inc() uint32 { now := TimestampFunc().UnixNano() resetAt := atomic.LoadInt64(&s.resetAt) var c uint32 - if now > resetAt { + if now >= resetAt { c = 1 atomic.StoreUint32(&s.counter, c) newResetAt := now + s.Period.Nanoseconds() diff --git a/sampler_test.go b/sampler_test.go index 248bd301..b986375d 100644 --- a/sampler_test.go +++ b/sampler_test.go @@ -1,3 +1,4 @@ +//go:build !binary_log // +build !binary_log package zerolog @@ -103,3 +104,34 @@ func BenchmarkSamplers(b *testing.B) { }) } } + +func TestBurst(t *testing.T) { + sampler := &BurstSampler{Burst: 1, Period: time.Second} + + t0 := time.Now() + now := t0 + mockedTime := func() time.Time { + return now + } + + TimestampFunc = mockedTime + defer func() { TimestampFunc = time.Now }() + + scenario := []struct { + tm time.Time + want bool + }{ + {t0, true}, + {t0.Add(time.Second - time.Nanosecond), false}, + {t0.Add(time.Second), true}, + {t0.Add(time.Second + time.Nanosecond), false}, + } + + for i, step := range scenario { + now = step.tm + got := sampler.Sample(NoLevel) + if got != step.want { + t.Errorf("step %d (t=%s): expect %t got %t", i, step.tm, step.want, got) + } + } +} From 04ea0f4371b35472e5cda5468daeb3ea5c574ffb Mon Sep 17 00:00:00 2001 From: Andrey36652 <35865938+Andrey36652@users.noreply.github.com> Date: Wed, 12 Mar 2025 15:16:56 +0300 Subject: [PATCH 06/10] Implement Close() for zerolog.FilteredLevelWriter (#715) --- console_test.go | 33 ++++++++++++++++++++++------ diode/diode_test.go | 52 +++++++++++++++++++++++++++++++++++++++++++++ writer.go | 9 ++++++++ 3 files changed, 87 insertions(+), 7 deletions(-) diff --git a/console_test.go b/console_test.go index 8490c9e7..6b97f6ca 100644 --- a/console_test.go +++ b/console_test.go @@ -2,9 +2,11 @@ package zerolog_test import ( "bytes" + "encoding/json" "fmt" "io" "os" + "path/filepath" "strings" "testing" "time" @@ -315,16 +317,33 @@ func TestConsoleWriter(t *testing.T) { ts := time.Unix(0, 0) d := ts.UTC().Format(time.RFC3339) - evt := `{"time": "` + d + `", "level": "debug", "message": "Foobar", "foo": "bar", "caller": "` + cwd + `/foo/bar.go"}` - // t.Log(evt) - _, err = w.Write([]byte(evt)) + fields := map[string]interface{}{ + "time": d, + "level": "debug", + "message": "Foobar", + "foo": "bar", + "caller": filepath.Join(cwd, "foo", "bar.go"), + } + + evt, err := json.Marshal(fields) + if err != nil { + t.Fatalf("Cannot marshal fields: %s", err) + } + + _, err = w.Write(evt) if err != nil { t.Errorf("Unexpected error when writing output: %s", err) } + // Define the expected output with forward slashes expectedOutput := ts.Format(time.Kitchen) + " DBG foo/bar.go > Foobar foo=bar\n" + + // Get the actual output and normalize path separators to forward slashes actualOutput := buf.String() + actualOutput = strings.ReplaceAll(actualOutput, string(os.PathSeparator), "/") + + // Compare the normalized actual output to the expected output if actualOutput != expectedOutput { t.Errorf("Unexpected output %q, want: %q", actualOutput, expectedOutput) } @@ -451,14 +470,14 @@ func TestConsoleWriterConfiguration(t *testing.T) { }) t.Run("Sets TimeFormat and TimeLocation", func(t *testing.T) { - locs := []*time.Location{ time.Local, time.UTC } + locs := []*time.Location{time.Local, time.UTC} for _, location := range locs { buf := &bytes.Buffer{} w := zerolog.ConsoleWriter{ - Out: buf, - NoColor: true, - TimeFormat: time.RFC3339, + Out: buf, + NoColor: true, + TimeFormat: time.RFC3339, TimeLocation: location, } diff --git a/diode/diode_test.go b/diode/diode_test.go index ab6b55e3..473076cf 100644 --- a/diode/diode_test.go +++ b/diode/diode_test.go @@ -76,6 +76,58 @@ func TestFatal(t *testing.T) { } } +type SlowWriter struct{} + +func (rw *SlowWriter) Write(p []byte) (n int, err error) { + time.Sleep(200 * time.Millisecond) + fmt.Print(string(p)) + return len(p), nil +} + +func TestFatalWithFilteredLevelWriter(t *testing.T) { + if os.Getenv("TEST_FATAL_SLOW") == "1" { + slowWriter := SlowWriter{} + diodeWriter := diode.NewWriter(&slowWriter, 500, 0, func(missed int) { + fmt.Printf("Missed %d logs\n", missed) + }) + leveledDiodeWriter := zerolog.LevelWriterAdapter{ + Writer: &diodeWriter, + } + filteredDiodeWriter := zerolog.FilteredLevelWriter{ + Writer: &leveledDiodeWriter, + Level: zerolog.InfoLevel, + } + logger := zerolog.New(&filteredDiodeWriter) + logger.Fatal().Msg("test") + return + } + + cmd := exec.Command(os.Args[0], "-test.run=TestFatalWithFilteredLevelWriter") + cmd.Env = append(os.Environ(), "TEST_FATAL_SLOW=1") + stdout, err := cmd.StdoutPipe() + if err != nil { + t.Fatal(err) + } + err = cmd.Start() + if err != nil { + t.Fatal(err) + } + slurp, err := io.ReadAll(stdout) + if err != nil { + t.Fatal(err) + } + err = cmd.Wait() + if err == nil { + t.Error("Expected log.Fatal to exit with non-zero status") + } + + got := cbor.DecodeIfBinaryToString(slurp) + want := "{\"level\":\"fatal\",\"message\":\"test\"}\n" + if got != want { + t.Errorf("Expected output %q, got: %q", want, got) + } +} + func Benchmark(b *testing.B) { log.SetOutput(io.Discard) defer log.SetOutput(os.Stderr) diff --git a/writer.go b/writer.go index 41b394d7..0fc5ff59 100644 --- a/writer.go +++ b/writer.go @@ -213,6 +213,15 @@ func (w *FilteredLevelWriter) WriteLevel(level Level, p []byte) (int, error) { return len(p), nil } +// Call the underlying writer's Close method if it is an io.Closer. Otherwise +// does nothing. +func (w *FilteredLevelWriter) Close() error { + if closer, ok := w.Writer.(io.Closer); ok { + return closer.Close() + } + return nil +} + var triggerWriterPool = &sync.Pool{ New: func() interface{} { return bytes.NewBuffer(make([]byte, 0, 1024)) From cc4dde7383252eb0f0b99067dd1d7a2e61ba6ac2 Mon Sep 17 00:00:00 2001 From: Olivier Poitrey Date: Fri, 21 Mar 2025 00:58:35 +0100 Subject: [PATCH 07/10] Create CONTRIBUTING.md --- CONTRIBUTING.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..a09e9e21 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,43 @@ +# Contributing to Zerolog + +Thank you for your interest in contributing to **Zerolog**! + +Zerolog is a **feature-complete**, high-performance logging library designed to be **lean** and **non-bloated**. The focus of ongoing development is on **bug fixes**, **performance improvements**, and **modernization efforts** (such as keeping up with Go best practices and compatibility with newer Go versions). + +## What We're Looking For + +We welcome contributions in the following areas: + +- **Bug Fixes**: If you find an issue or unexpected behavior, please open an issue and/or submit a fix. +- **Performance Optimizations**: Improvements that reduce memory usage, allocation count, or CPU cycles without introducing complexity are appreciated. +- **Modernization**: Compatibility updates for newer Go versions or idiomatic improvements that do not increase library size or complexity. +- **Documentation Enhancements**: Corrections, clarifications, and improvements to documentation or code comments. + +## What We're *Not* Looking For + +Zerolog is intended to remain **minimalistic and efficient**. Therefore, we are **not accepting**: + +- New features that add optional behaviors or extend API surface area. +- Built-in support for frameworks or external systems (e.g., bindings, integrations). +- General-purpose abstractions or configuration helpers. + +If you're unsure whether a change aligns with the project's philosophy, feel free to open an issue for discussion before submitting a PR. + +## Contributing Guidelines + +1. **Fork the repository** +2. **Create a branch** for your fix or improvement +3. **Write tests** to cover your changes +4. Ensure `go test ./...` passes +5. Run `go fmt` and `go vet` to ensure code consistency +6. **Submit a pull request** with a clear explanation of the motivation and impact + +## Code Style + +- Keep the code simple, efficient, and idiomatic. +- Avoid introducing new dependencies. +- Preserve backwards compatibility unless explicitly discussed. + +--- + +We appreciate your effort in helping us keep Zerolog fast, minimal, and reliable! From ffb27080ca298f9827a625d247d9c50fdf28cd8f Mon Sep 17 00:00:00 2001 From: Olivier Poitrey Date: Thu, 20 Mar 2025 17:01:12 -0700 Subject: [PATCH 08/10] Remove CNAME file --- CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 CNAME diff --git a/CNAME b/CNAME deleted file mode 100644 index 9ce57a6e..00000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -zerolog.io \ No newline at end of file From 5f4b880a01c1a905549ab70ecad797e19f09d9a7 Mon Sep 17 00:00:00 2001 From: Olivier Poitrey Date: Fri, 21 Mar 2025 01:03:04 +0100 Subject: [PATCH 09/10] Delete _config.yml --- _config.yml | 1 - 1 file changed, 1 deletion(-) delete mode 100644 _config.yml diff --git a/_config.yml b/_config.yml deleted file mode 100644 index a1e896d7..00000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -remote_theme: rs/gh-readme From db9d1bebd9c0810ec04bc7e4199655f85c5b479b Mon Sep 17 00:00:00 2001 From: Olivier Poitrey Date: Fri, 21 Mar 2025 01:06:46 +0100 Subject: [PATCH 10/10] Update go versions covered by CI --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a9725b3d..01f9e015 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,7 +4,7 @@ jobs: test: strategy: matrix: - go-version: [1.18.x, 1.21.x] + go-version: [1.21.x, 1.24.x] os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} steps: