@@ -152,6 +152,9 @@ func (fe *FilterEncoder) ConfigureDefaultFormat(wo caddy.WriterOpener) error {
152
152
func (fe * FilterEncoder ) UnmarshalCaddyfile (d * caddyfile.Dispenser ) error {
153
153
d .Next () // consume encoder name
154
154
155
+ // Track regexp filters for automatic merging
156
+ regexpFilters := make (map [string ][]* RegexpFilter )
157
+
155
158
// parse a field
156
159
parseField := func () error {
157
160
if fe .FieldsRaw == nil {
@@ -171,6 +174,23 @@ func (fe *FilterEncoder) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
171
174
if ! ok {
172
175
return d .Errf ("module %s (%T) is not a logging.LogFieldFilter" , moduleID , unm )
173
176
}
177
+
178
+ // Special handling for regexp filters to support multiple instances
179
+ if regexpFilter , isRegexp := filter .(* RegexpFilter ); isRegexp {
180
+ regexpFilters [field ] = append (regexpFilters [field ], regexpFilter )
181
+ return nil // Don't set FieldsRaw yet, we'll merge them later
182
+ }
183
+
184
+ // Check if we're trying to add a non-regexp filter to a field that already has regexp filters
185
+ if _ , hasRegexpFilters := regexpFilters [field ]; hasRegexpFilters {
186
+ return d .Errf ("cannot mix regexp filters with other filter types for field %s" , field )
187
+ }
188
+
189
+ // Check if field already has a filter and it's not regexp-related
190
+ if _ , exists := fe .FieldsRaw [field ]; exists {
191
+ return d .Errf ("field %s already has a filter; multiple non-regexp filters per field are not supported" , field )
192
+ }
193
+
174
194
fe .FieldsRaw [field ] = caddyconfig .JSONModuleObject (filter , "filter" , filterName , nil )
175
195
return nil
176
196
}
@@ -210,6 +230,25 @@ func (fe *FilterEncoder) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
210
230
}
211
231
}
212
232
}
233
+
234
+ // After parsing all fields, merge multiple regexp filters into MultiRegexpFilter
235
+ for field , filters := range regexpFilters {
236
+ if len (filters ) == 1 {
237
+ // Single regexp filter, use the original RegexpFilter
238
+ fe .FieldsRaw [field ] = caddyconfig .JSONModuleObject (filters [0 ], "filter" , "regexp" , nil )
239
+ } else {
240
+ // Multiple regexp filters, merge into MultiRegexpFilter
241
+ multiFilter := & MultiRegexpFilter {}
242
+ for _ , regexpFilter := range filters {
243
+ err := multiFilter .AddOperation (regexpFilter .RawRegexp , regexpFilter .Value )
244
+ if err != nil {
245
+ return fmt .Errorf ("adding regexp operation for field %s: %v" , field , err )
246
+ }
247
+ }
248
+ fe .FieldsRaw [field ] = caddyconfig .JSONModuleObject (multiFilter , "filter" , "multi_regexp" , nil )
249
+ }
250
+ }
251
+
213
252
return nil
214
253
}
215
254
0 commit comments