@@ -70,9 +70,7 @@ func (l *slogHandler) Handle(ctx context.Context, record slog.Record) error {
70
70
71
71
kvList := make ([]any , 0 , 2 * record .NumAttrs ())
72
72
record .Attrs (func (attr slog.Attr ) bool {
73
- if attr .Key != "" {
74
- kvList = append (kvList , l .addGroupPrefix (attr .Key ), attr .Value .Resolve ().Any ())
75
- }
73
+ kvList = attrToKVs (attr , l .groupPrefix , kvList )
76
74
return true
77
75
})
78
76
if record .Level >= slog .LevelError {
@@ -114,9 +112,7 @@ func (l *slogHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
114
112
} else {
115
113
kvList := make ([]any , 0 , 2 * len (attrs ))
116
114
for _ , attr := range attrs {
117
- if attr .Key != "" {
118
- kvList = append (kvList , l .addGroupPrefix (attr .Key ), attr .Value .Resolve ().Any ())
119
- }
115
+ kvList = attrToKVs (attr , l .groupPrefix , kvList )
120
116
}
121
117
clone .sink = l .sink .WithValues (kvList ... )
122
118
}
@@ -136,16 +132,41 @@ func (l *slogHandler) WithGroup(name string) slog.Handler {
136
132
clone .slogSink = l .slogSink .WithGroup (name )
137
133
clone .sink = clone .slogSink
138
134
} else {
139
- clone .groupPrefix = clone .addGroupPrefix ( name )
135
+ clone .groupPrefix = addPrefix ( clone .groupPrefix , name )
140
136
}
141
137
return & clone
142
138
}
143
139
144
- func (l * slogHandler ) addGroupPrefix (name string ) string {
145
- if l .groupPrefix == "" {
140
+ // attrToKVs appends a slog.Attr to a logr-style kvList. It handle slog Groups
141
+ // and other details of slog.
142
+ func attrToKVs (attr slog.Attr , groupPrefix string , kvList []any ) []any {
143
+ attrVal := attr .Value .Resolve ()
144
+ if attrVal .Kind () == slog .KindGroup {
145
+ groupVal := attrVal .Group ()
146
+ grpKVs := make ([]any , 0 , 2 * len (groupVal ))
147
+ prefix := groupPrefix
148
+ if attr .Key != "" {
149
+ prefix = addPrefix (groupPrefix , attr .Key )
150
+ }
151
+ for _ , attr := range groupVal {
152
+ grpKVs = attrToKVs (attr , prefix , grpKVs )
153
+ }
154
+ kvList = append (kvList , grpKVs ... )
155
+ } else if attr .Key != "" {
156
+ kvList = append (kvList , addPrefix (groupPrefix , attr .Key ), attrVal .Any ())
157
+ }
158
+
159
+ return kvList
160
+ }
161
+
162
+ func addPrefix (prefix , name string ) string {
163
+ if prefix == "" {
146
164
return name
147
165
}
148
- return l .groupPrefix + groupSeparator + name
166
+ if name == "" {
167
+ return prefix
168
+ }
169
+ return prefix + groupSeparator + name
149
170
}
150
171
151
172
// levelFromSlog adjusts the level by the logger's verbosity and negates it.
0 commit comments