diff --git a/src/log/slog/record.go b/src/log/slog/record.go index 3b4e68ce766f5f..cae440dcfab39d 100644 --- a/src/log/slog/record.go +++ b/src/log/slog/record.go @@ -5,6 +5,7 @@ package slog import ( + "iter" "runtime" "slices" "time" @@ -92,6 +93,11 @@ func (r Record) Attrs(f func(Attr) bool) { } } +// AllAttrs returns an iterator over every attribute in the [Record]. +func (r Record) AllAttrs() iter.Seq[Attr] { + return r.Attrs +} + // AddAttrs appends the given Attrs to the [Record]'s list of Attrs. // It omits empty groups. func (r *Record) AddAttrs(attrs ...Attr) { diff --git a/src/log/slog/record_test.go b/src/log/slog/record_test.go index 939dc34ac8557d..087a6504c1d7dc 100644 --- a/src/log/slog/record_test.go +++ b/src/log/slog/record_test.go @@ -36,6 +36,22 @@ func TestRecordAttrs(t *testing.T) { t.Errorf("got %v, want %v", got, want) } } + + // Early return with iterator. + // Hit both loops in Record.Attrs: front and back. + for _, stop := range []int{2, 6} { + var got []Attr + for a := range r.AllAttrs() { + got = append(got, a) + if len(got) < stop { + break + } + } + want := as[:stop] + if !attrsEqual(got, want) { + t.Errorf("got %v, want %v", got, want) + } + } } func TestRecordSource(t *testing.T) {