@@ -210,6 +210,8 @@ pub(crate) struct Builder {
210
210
pub ( crate ) format_indent : Option < usize > ,
211
211
pub ( crate ) custom_format : Option < FormatFn > ,
212
212
pub ( crate ) format_suffix : & ' static str ,
213
+ pub ( crate ) format_file : bool ,
214
+ pub ( crate ) format_line_number : bool ,
213
215
#[ cfg( feature = "unstable-kv" ) ]
214
216
pub ( crate ) kv_format : Option < Box < KvFormatFn > > ,
215
217
built : bool ,
@@ -244,6 +246,8 @@ impl Builder {
244
246
written_header_value : false ,
245
247
indent : built. format_indent ,
246
248
suffix : built. format_suffix ,
249
+ source_file : built. format_file ,
250
+ source_line_number : built. format_line_number ,
247
251
#[ cfg( feature = "unstable-kv" ) ]
248
252
kv_format : built. kv_format . as_deref ( ) . unwrap_or ( & default_kv_format) ,
249
253
buf,
@@ -262,6 +266,8 @@ impl Default for Builder {
262
266
format_module_path : false ,
263
267
format_target : true ,
264
268
format_level : true ,
269
+ format_file : false ,
270
+ format_line_number : false ,
265
271
format_indent : Some ( 4 ) ,
266
272
custom_format : None ,
267
273
format_suffix : "\n " ,
@@ -309,6 +315,8 @@ struct DefaultFormat<'a> {
309
315
module_path : bool ,
310
316
target : bool ,
311
317
level : bool ,
318
+ source_file : bool ,
319
+ source_line_number : bool ,
312
320
written_header_value : bool ,
313
321
indent : Option < usize > ,
314
322
buf : & ' a mut Formatter ,
@@ -322,6 +330,7 @@ impl DefaultFormat<'_> {
322
330
self . write_timestamp ( ) ?;
323
331
self . write_level ( record) ?;
324
332
self . write_module_path ( record) ?;
333
+ self . write_source_location ( record) ?;
325
334
self . write_target ( record) ?;
326
335
self . finish_header ( ) ?;
327
336
@@ -421,6 +430,22 @@ impl DefaultFormat<'_> {
421
430
}
422
431
}
423
432
433
+ fn write_source_location ( & mut self , record : & Record < ' _ > ) -> io:: Result < ( ) > {
434
+ if !self . source_file {
435
+ return Ok ( ( ) ) ;
436
+ }
437
+
438
+ if let Some ( file_path) = record. file ( ) {
439
+ let line = self . source_line_number . then ( || record. line ( ) ) . flatten ( ) ;
440
+ match line {
441
+ Some ( line) => self . write_header_value ( format_args ! ( "{file_path}:{line}" ) ) ,
442
+ None => self . write_header_value ( file_path) ,
443
+ }
444
+ } else {
445
+ Ok ( ( ) )
446
+ }
447
+ }
448
+
424
449
fn write_target ( & mut self , record : & Record < ' _ > ) -> io:: Result < ( ) > {
425
450
if !self . target {
426
451
return Ok ( ( ) ) ;
@@ -550,6 +575,8 @@ mod tests {
550
575
module_path : true ,
551
576
target : false ,
552
577
level : true ,
578
+ source_file : false ,
579
+ source_line_number : false ,
553
580
#[ cfg( feature = "unstable-kv" ) ]
554
581
kv_format : & hidden_kv_format,
555
582
written_header_value : false ,
@@ -570,6 +597,8 @@ mod tests {
570
597
module_path : false ,
571
598
target : false ,
572
599
level : false ,
600
+ source_file : false ,
601
+ source_line_number : false ,
573
602
#[ cfg( feature = "unstable-kv" ) ]
574
603
kv_format : & hidden_kv_format,
575
604
written_header_value : false ,
@@ -590,6 +619,8 @@ mod tests {
590
619
module_path : true ,
591
620
target : false ,
592
621
level : true ,
622
+ source_file : false ,
623
+ source_line_number : false ,
593
624
#[ cfg( feature = "unstable-kv" ) ]
594
625
kv_format : & hidden_kv_format,
595
626
written_header_value : false ,
@@ -610,6 +641,8 @@ mod tests {
610
641
module_path : true ,
611
642
target : false ,
612
643
level : true ,
644
+ source_file : false ,
645
+ source_line_number : false ,
613
646
#[ cfg( feature = "unstable-kv" ) ]
614
647
kv_format : & hidden_kv_format,
615
648
written_header_value : false ,
@@ -630,6 +663,8 @@ mod tests {
630
663
module_path : false ,
631
664
target : false ,
632
665
level : false ,
666
+ source_file : false ,
667
+ source_line_number : false ,
633
668
#[ cfg( feature = "unstable-kv" ) ]
634
669
kv_format : & hidden_kv_format,
635
670
written_header_value : false ,
@@ -650,6 +685,8 @@ mod tests {
650
685
module_path : false ,
651
686
target : false ,
652
687
level : false ,
688
+ source_file : false ,
689
+ source_line_number : false ,
653
690
#[ cfg( feature = "unstable-kv" ) ]
654
691
kv_format : & hidden_kv_format,
655
692
written_header_value : false ,
@@ -670,6 +707,8 @@ mod tests {
670
707
module_path : false ,
671
708
target : false ,
672
709
level : false ,
710
+ source_file : false ,
711
+ source_line_number : false ,
673
712
#[ cfg( feature = "unstable-kv" ) ]
674
713
kv_format : & hidden_kv_format,
675
714
written_header_value : false ,
@@ -692,6 +731,8 @@ mod tests {
692
731
module_path : true ,
693
732
target : true ,
694
733
level : true ,
734
+ source_file : false ,
735
+ source_line_number : false ,
695
736
#[ cfg( feature = "unstable-kv" ) ]
696
737
kv_format : & hidden_kv_format,
697
738
written_header_value : false ,
@@ -713,6 +754,8 @@ mod tests {
713
754
module_path : true ,
714
755
target : true ,
715
756
level : true ,
757
+ source_file : false ,
758
+ source_line_number : false ,
716
759
#[ cfg( feature = "unstable-kv" ) ]
717
760
kv_format : & hidden_kv_format,
718
761
written_header_value : false ,
@@ -735,6 +778,8 @@ mod tests {
735
778
module_path : true ,
736
779
target : false ,
737
780
level : true ,
781
+ source_file : false ,
782
+ source_line_number : false ,
738
783
#[ cfg( feature = "unstable-kv" ) ]
739
784
kv_format : & hidden_kv_format,
740
785
written_header_value : false ,
@@ -747,6 +792,28 @@ mod tests {
747
792
assert_eq ! ( "[INFO test::path] log\n message\n " , written) ;
748
793
}
749
794
795
+ #[ test]
796
+ fn format_with_source_file_and_line_number ( ) {
797
+ let mut f = formatter ( ) ;
798
+
799
+ let written = write ( DefaultFormat {
800
+ timestamp : None ,
801
+ module_path : false ,
802
+ target : false ,
803
+ level : true ,
804
+ source_file : true ,
805
+ source_line_number : true ,
806
+ #[ cfg( feature = "unstable-kv" ) ]
807
+ kv_format : & hidden_kv_format,
808
+ written_header_value : false ,
809
+ indent : None ,
810
+ suffix : "\n " ,
811
+ buf : & mut f,
812
+ } ) ;
813
+
814
+ assert_eq ! ( "[INFO test.rs:144] log\n message\n " , written) ;
815
+ }
816
+
750
817
#[ cfg( feature = "unstable-kv" ) ]
751
818
#[ test]
752
819
fn format_kv_default ( ) {
@@ -766,6 +833,8 @@ mod tests {
766
833
module_path : false ,
767
834
target : false ,
768
835
level : true ,
836
+ source_file : false ,
837
+ source_line_number : false ,
769
838
kv_format : & default_kv_format,
770
839
written_header_value : false ,
771
840
indent : None ,
@@ -799,6 +868,8 @@ mod tests {
799
868
module_path : true ,
800
869
target : true ,
801
870
level : true ,
871
+ source_file : true ,
872
+ source_line_number : true ,
802
873
kv_format : & default_kv_format,
803
874
written_header_value : false ,
804
875
indent : None ,
@@ -807,6 +878,9 @@ mod tests {
807
878
} ,
808
879
) ;
809
880
810
- assert_eq ! ( "[INFO test::path target] log\n message a=1 b=2\n " , written) ;
881
+ assert_eq ! (
882
+ "[INFO test::path test.rs:42 target] log\n message a=1 b=2\n " ,
883
+ written
884
+ ) ;
811
885
}
812
886
}
0 commit comments