@@ -74,6 +74,9 @@ struct logger {
74
74
75
75
/* Print log message at >= this level */
76
76
enum log_level print_level ;
77
+ /* For non-trivial setups, we might need to test filters again
78
+ * when actually producing output. */
79
+ bool need_refiltering ;
77
80
};
78
81
79
82
static struct log_prefix * log_prefix_new (const tal_t * ctx ,
@@ -154,10 +157,45 @@ static bool filter_level(const struct list_head *print_filters,
154
157
return false;
155
158
}
156
159
160
+ /* What's the lowest filtering which could possibly apply? */
161
+ static void lowest_filter (const struct list_head * print_filters ,
162
+ const char * prefix ,
163
+ const struct node_id * node_id ,
164
+ enum log_level * level )
165
+ {
166
+ struct print_filter * i ;
167
+ const char * node_id_str ;
168
+
169
+ if (node_id )
170
+ node_id_str = node_id_to_hexstr (tmpctx , node_id );
171
+ else
172
+ node_id_str = NULL ;
173
+
174
+ list_for_each (print_filters , i , list ) {
175
+ bool match ;
176
+
177
+ if (strstr (prefix , i -> prefix ))
178
+ match = true;
179
+ else if (node_id_str ) {
180
+ match = (strstr (node_id_str , i -> prefix ) != NULL );
181
+ } else {
182
+ /* Could this possibly match a node_id? */
183
+ match = strstarts (i -> prefix , "02" ) || strstarts (i -> prefix , "03" );
184
+ }
185
+
186
+ if (match && i -> level < * level ) {
187
+ * level = i -> level ;
188
+ }
189
+ }
190
+ }
191
+
157
192
static void log_to_files (const char * log_prefix ,
158
193
const char * entry_prefix ,
159
194
enum log_level level ,
195
+ /* The node_id to log under. */
160
196
const struct node_id * node_id ,
197
+ /* Filters to apply, if non-NULL */
198
+ const struct list_head * print_filters ,
161
199
const struct timeabs * time ,
162
200
const char * str ,
163
201
const u8 * io ,
@@ -203,6 +241,17 @@ static void log_to_files(const char *log_prefix,
203
241
entry_prefix , str );
204
242
}
205
243
244
+ /* In complex configurations, we tell loggers to overshare: then we
245
+ * need to filter here to see if we really want it. */
246
+ if (print_filters ) {
247
+ enum log_level filter ;
248
+ if (filter_level (print_filters ,
249
+ entry_prefix , nodestr , & filter )) {
250
+ if (level < filter )
251
+ return ;
252
+ }
253
+ }
254
+
206
255
/* Default if nothing set is stdout */
207
256
if (!log_files ) {
208
257
fwrite (entry , strlen (entry ), 1 , stdout );
@@ -336,32 +385,34 @@ struct log_book *new_log_book(struct lightningd *ld, size_t max_mem)
336
385
return log_book ;
337
386
}
338
387
339
- /* What's the minimum level to print for this log book? */
388
+ /* What's the minimum level to print this prefix and node_id for this
389
+ * log book? Saves us marshalling long print lines in most cases. */
340
390
static enum log_level print_level (struct log_book * log_book ,
341
391
const struct log_prefix * lp ,
342
- const struct node_id * node_id )
392
+ const struct node_id * node_id ,
393
+ bool * need_refiltering )
343
394
{
344
- enum log_level level ;
345
- const char * node_id_str = node_id ? node_id_to_hexstr ( tmpctx , node_id ) : "" ;
395
+ enum log_level level = * log_book -> default_print_level ;
396
+ bool have_filters = false ;
346
397
347
- assert (log_book -> default_print_level != NULL );
348
- if (!filter_level (& log_book -> print_filters , lp -> prefix ,
349
- node_id_str , & level )) {
350
- level = * log_book -> default_print_level ;
351
- }
398
+ lowest_filter (& log_book -> print_filters , lp -> prefix , node_id , & level );
399
+ if (!list_empty (& log_book -> print_filters ))
400
+ have_filters = true;
352
401
353
402
/* We need to look into per-file filters as well: might give a
354
403
* lower filter! */
355
404
for (size_t i = 0 ; i < tal_count (log_book -> log_files ); i ++ ) {
356
- enum log_level sublevel ;
357
- if (filter_level (& log_book -> log_files [i ]-> print_filters ,
358
- lp -> prefix , node_id_str , & sublevel )) {
359
- if (sublevel < level ) {
360
- level = sublevel ;
361
- }
362
- }
405
+ lowest_filter (& log_book -> log_files [i ]-> print_filters ,
406
+ lp -> prefix , node_id , & level );
407
+ if (!list_empty (& log_book -> log_files [i ]-> print_filters ))
408
+ have_filters = true;
363
409
}
364
410
411
+ /* Almost any complex array of filters can mean we want to re-check
412
+ * when logging. */
413
+ if (need_refiltering )
414
+ * need_refiltering = have_filters ;
415
+
365
416
return level ;
366
417
}
367
418
@@ -389,10 +440,15 @@ new_logger(const tal_t *ctx, struct log_book *log_book,
389
440
default_node_id );
390
441
391
442
/* Still initializing? Print UNUSUAL / BROKEN messages only */
392
- if (!log -> log_book -> default_print_level )
443
+ if (!log -> log_book -> default_print_level ) {
393
444
log -> print_level = LOG_UNUSUAL ;
394
- else
395
- log -> print_level = print_level (log -> log_book , log -> prefix , default_node_id );
445
+ log -> need_refiltering = false;
446
+ } else {
447
+ log -> print_level = print_level (log -> log_book ,
448
+ log -> prefix ,
449
+ default_node_id ,
450
+ & log -> need_refiltering );
451
+ }
396
452
list_add (& log -> log_book -> loggers , & log -> list );
397
453
tal_add_destructor (log , destroy_logger );
398
454
return log ;
@@ -405,7 +461,7 @@ const char *log_prefix(const struct logger *log)
405
461
406
462
bool log_has_io_logging (const struct logger * log )
407
463
{
408
- return print_level (log -> log_book , log -> prefix , log -> default_node_id ) < LOG_DBG ;
464
+ return print_level (log -> log_book , log -> prefix , log -> default_node_id , NULL ) < LOG_DBG ;
409
465
}
410
466
411
467
/* This may move entry! */
@@ -467,6 +523,7 @@ static void maybe_print(struct logger *log, const struct log_entry *l)
467
523
if (l -> level >= log -> print_level )
468
524
log_to_files (log -> log_book -> prefix , log -> prefix -> prefix , l -> level ,
469
525
l -> nc ? & l -> nc -> node_id : NULL ,
526
+ log -> need_refiltering ? & log -> log_book -> print_filters : NULL ,
470
527
& l -> time , l -> log ,
471
528
l -> io , tal_bytelen (l -> io ),
472
529
log -> log_book -> print_timestamps ,
@@ -518,6 +575,7 @@ void log_io(struct logger *log, enum log_level dir,
518
575
if (l -> level >= log -> print_level )
519
576
log_to_files (log -> log_book -> prefix , log -> prefix -> prefix , l -> level ,
520
577
l -> nc ? & l -> nc -> node_id : NULL ,
578
+ log -> need_refiltering ? & log -> log_book -> print_filters : NULL ,
521
579
& l -> time , str ,
522
580
data , len ,
523
581
log -> log_book -> print_timestamps ,
@@ -857,16 +915,18 @@ void logging_options_parsed(struct log_book *log_book)
857
915
list_for_each (& log_book -> loggers , log , list ) {
858
916
log -> print_level = print_level (log_book ,
859
917
log -> prefix ,
860
- log -> default_node_id );
918
+ log -> default_node_id ,
919
+ & log -> need_refiltering );
861
920
}
862
921
863
922
/* Catch up, since before we were only printing BROKEN msgs */
864
923
for (size_t i = 0 ; i < log_book -> num_entries ; i ++ ) {
865
924
const struct log_entry * l = & log_book -> log [i ];
866
925
867
- if (l -> level >= print_level (log_book , l -> prefix , l -> nc ? & l -> nc -> node_id : NULL ))
926
+ if (l -> level >= print_level (log_book , l -> prefix , l -> nc ? & l -> nc -> node_id : NULL , NULL ))
868
927
log_to_files (log_book -> prefix , l -> prefix -> prefix , l -> level ,
869
928
l -> nc ? & l -> nc -> node_id : NULL ,
929
+ & log_book -> print_filters ,
870
930
& l -> time , l -> log ,
871
931
l -> io , tal_bytelen (l -> io ),
872
932
log_book -> print_timestamps ,
0 commit comments