@@ -5478,6 +5478,7 @@ def test_critical(self):
5478
5478
self .assertEqual (record .levelno , logging .CRITICAL )
5479
5479
self .assertEqual (record .msg , msg )
5480
5480
self .assertEqual (record .args , (self .recording ,))
5481
+ self .assertEqual (record .funcName , 'test_critical' )
5481
5482
5482
5483
def test_is_enabled_for (self ):
5483
5484
old_disable = self .adapter .logger .manager .disable
@@ -5496,15 +5497,9 @@ def test_has_handlers(self):
5496
5497
self .assertFalse (self .adapter .hasHandlers ())
5497
5498
5498
5499
def test_nested (self ):
5499
- class Adapter (logging .LoggerAdapter ):
5500
- prefix = 'Adapter'
5501
-
5502
- def process (self , msg , kwargs ):
5503
- return f"{ self .prefix } { msg } " , kwargs
5504
-
5505
5500
msg = 'Adapters can be nested, yo.'
5506
- adapter = Adapter (logger = self .logger , extra = None )
5507
- adapter_adapter = Adapter (logger = adapter , extra = None )
5501
+ adapter = PrefixAdapter (logger = self .logger , extra = None )
5502
+ adapter_adapter = PrefixAdapter (logger = adapter , extra = None )
5508
5503
adapter_adapter .prefix = 'AdapterAdapter'
5509
5504
self .assertEqual (repr (adapter ), repr (adapter_adapter ))
5510
5505
adapter_adapter .log (logging .CRITICAL , msg , self .recording )
@@ -5513,6 +5508,7 @@ def process(self, msg, kwargs):
5513
5508
self .assertEqual (record .levelno , logging .CRITICAL )
5514
5509
self .assertEqual (record .msg , f"Adapter AdapterAdapter { msg } " )
5515
5510
self .assertEqual (record .args , (self .recording ,))
5511
+ self .assertEqual (record .funcName , 'test_nested' )
5516
5512
orig_manager = adapter_adapter .manager
5517
5513
self .assertIs (adapter .manager , orig_manager )
5518
5514
self .assertIs (self .logger .manager , orig_manager )
@@ -5528,6 +5524,61 @@ def process(self, msg, kwargs):
5528
5524
self .assertIs (adapter .manager , orig_manager )
5529
5525
self .assertIs (self .logger .manager , orig_manager )
5530
5526
5527
+ def test_styled_adapter (self ):
5528
+ # Test an example from the Cookbook.
5529
+ records = self .recording .records
5530
+ adapter = StyleAdapter (self .logger )
5531
+ adapter .warning ('Hello, {}!' , 'world' )
5532
+ self .assertEqual (str (records [- 1 ].msg ), 'Hello, world!' )
5533
+ self .assertEqual (records [- 1 ].funcName , 'test_styled_adapter' )
5534
+ adapter .log (logging .WARNING , 'Goodbye {}.' , 'world' )
5535
+ self .assertEqual (str (records [- 1 ].msg ), 'Goodbye world.' )
5536
+ self .assertEqual (records [- 1 ].funcName , 'test_styled_adapter' )
5537
+
5538
+ def test_nested_styled_adapter (self ):
5539
+ records = self .recording .records
5540
+ adapter = PrefixAdapter (self .logger )
5541
+ adapter .prefix = '{}'
5542
+ adapter2 = StyleAdapter (adapter )
5543
+ adapter2 .warning ('Hello, {}!' , 'world' )
5544
+ self .assertEqual (str (records [- 1 ].msg ), '{} Hello, world!' )
5545
+ self .assertEqual (records [- 1 ].funcName , 'test_nested_styled_adapter' )
5546
+ adapter2 .log (logging .WARNING , 'Goodbye {}.' , 'world' )
5547
+ self .assertEqual (str (records [- 1 ].msg ), '{} Goodbye world.' )
5548
+ self .assertEqual (records [- 1 ].funcName , 'test_nested_styled_adapter' )
5549
+
5550
+ def test_find_caller_with_stacklevel (self ):
5551
+ the_level = 1
5552
+ trigger = self .adapter .warning
5553
+
5554
+ def innermost ():
5555
+ trigger ('test' , stacklevel = the_level )
5556
+
5557
+ def inner ():
5558
+ innermost ()
5559
+
5560
+ def outer ():
5561
+ inner ()
5562
+
5563
+ records = self .recording .records
5564
+ outer ()
5565
+ self .assertEqual (records [- 1 ].funcName , 'innermost' )
5566
+ lineno = records [- 1 ].lineno
5567
+ the_level += 1
5568
+ outer ()
5569
+ self .assertEqual (records [- 1 ].funcName , 'inner' )
5570
+ self .assertGreater (records [- 1 ].lineno , lineno )
5571
+ lineno = records [- 1 ].lineno
5572
+ the_level += 1
5573
+ outer ()
5574
+ self .assertEqual (records [- 1 ].funcName , 'outer' )
5575
+ self .assertGreater (records [- 1 ].lineno , lineno )
5576
+ lineno = records [- 1 ].lineno
5577
+ the_level += 1
5578
+ outer ()
5579
+ self .assertEqual (records [- 1 ].funcName , 'test_find_caller_with_stacklevel' )
5580
+ self .assertGreater (records [- 1 ].lineno , lineno )
5581
+
5531
5582
def test_extra_in_records (self ):
5532
5583
self .adapter = logging .LoggerAdapter (logger = self .logger ,
5533
5584
extra = {'foo' : '1' })
@@ -5569,6 +5620,30 @@ def test_extra_merged_log_call_has_precedence(self):
5569
5620
self .assertEqual (record .foo , '2' )
5570
5621
5571
5622
5623
+ class PrefixAdapter (logging .LoggerAdapter ):
5624
+ prefix = 'Adapter'
5625
+
5626
+ def process (self , msg , kwargs ):
5627
+ return f"{ self .prefix } { msg } " , kwargs
5628
+
5629
+
5630
+ class Message :
5631
+ def __init__ (self , fmt , args ):
5632
+ self .fmt = fmt
5633
+ self .args = args
5634
+
5635
+ def __str__ (self ):
5636
+ return self .fmt .format (* self .args )
5637
+
5638
+
5639
+ class StyleAdapter (logging .LoggerAdapter ):
5640
+ def log (self , level , msg , / , * args , stacklevel = 1 , ** kwargs ):
5641
+ if self .isEnabledFor (level ):
5642
+ msg , kwargs = self .process (msg , kwargs )
5643
+ self .logger .log (level , Message (msg , args ), ** kwargs ,
5644
+ stacklevel = stacklevel + 1 )
5645
+
5646
+
5572
5647
class LoggerTest (BaseTest , AssertErrorMessage ):
5573
5648
5574
5649
def setUp (self ):
0 commit comments