@@ -25,15 +25,6 @@ class LogLevel(Enum):
25
25
return LogLevel
26
26
27
27
28
- def capture_logging_output (stdout ):
29
- return json .loads (stdout .getvalue ().strip ())
30
-
31
-
32
- def service_name ():
33
- chars = string .ascii_letters + string .digits
34
- return "" .join (random .SystemRandom ().choice (chars ) for _ in range (15 ))
35
-
36
-
37
28
@pytest .fixture
38
29
def logger (stdout , log_level ):
39
30
def _logger ():
@@ -44,30 +35,43 @@ def _logger():
44
35
return _logger
45
36
46
37
38
+ def capture_logging_output (stdout ):
39
+ return json .loads (stdout .getvalue ().strip ())
40
+
41
+
42
+ def capture_multiple_logging_statements_output (stdout ):
43
+ return [json .loads (line .strip ()) for line in stdout .getvalue ().split ("\n " ) if line ]
44
+
45
+
46
+ def service_name ():
47
+ chars = string .ascii_letters + string .digits
48
+ return "" .join (random .SystemRandom ().choice (chars ) for _ in range (15 ))
49
+
50
+
47
51
def test_copy_config_to_ext_loggers (stdout , logger , log_level ):
48
52
49
53
msg = "test message"
50
54
51
55
# GIVEN a external logger and powertools logger initialized
52
- logger = logger ()
53
- logger_initial_handlers = logger . handlers . copy ()
54
- logger_initial_level = logger . level
56
+ logger_1 = logger ()
57
+ logger_2 = logger ()
58
+
55
59
powertools_logger = Logger (service = service_name (), level = log_level .INFO .value , stream = stdout )
56
60
57
61
# WHEN configuration copied from powertools logger to ALL external loggers AND our external logger used
58
62
utils .copy_config_to_registered_loggers (source_logger = powertools_logger )
59
- logger .info (msg )
60
- log = capture_logging_output (stdout )
63
+ logger_1 .info (msg )
64
+ logger_2 .info (msg )
65
+ logs = capture_multiple_logging_statements_output (stdout )
61
66
62
67
# THEN
63
- assert not logger_initial_handlers
64
- assert logger_initial_level == log_level .NOTSET .value
65
- assert len (logger .handlers ) == 1
66
- assert type (logger .handlers [0 ]) is logging .StreamHandler
67
- assert type (logger .handlers [0 ].formatter ) is formatter .LambdaPowertoolsFormatter
68
- assert logger .level == log_level .INFO .value
69
- assert log ["message" ] == msg
70
- assert log ["level" ] == log_level .INFO .name
68
+ for index , logger in enumerate ([logger_1 , logger_2 ]):
69
+ assert len (logger .handlers ) == 1
70
+ assert type (logger .handlers [0 ]) is logging .StreamHandler
71
+ assert type (logger .handlers [0 ].formatter ) is formatter .LambdaPowertoolsFormatter
72
+ assert logger .level == log_level .INFO .value
73
+ assert logs [index ]["message" ] == msg
74
+ assert logs [index ]["level" ] == log_level .INFO .name
71
75
72
76
73
77
def test_copy_config_to_ext_loggers_include (stdout , logger , log_level ):
@@ -134,6 +138,7 @@ def test_copy_config_to_ext_loggers_include_exclude(stdout, logger, log_level):
134
138
)
135
139
logger_2 .info (msg )
136
140
log = capture_logging_output (stdout )
141
+
137
142
# THEN
138
143
assert not logger_1 .handlers
139
144
assert len (logger_2 .handlers ) == 1
@@ -142,3 +147,20 @@ def test_copy_config_to_ext_loggers_include_exclude(stdout, logger, log_level):
142
147
assert logger_2 .level == log_level .INFO .value
143
148
assert log ["message" ] == msg
144
149
assert log ["level" ] == log_level .INFO .name
150
+
151
+
152
+ def test_copy_config_to_ext_loggers_clean_old_handlers (stdout , logger , log_level ):
153
+
154
+ # GIVEN a external logger with handler and powertools logger initialized
155
+ logger = logger ()
156
+ handler = logging .FileHandler ("logfile" )
157
+ logger .addHandler (handler )
158
+ powertools_logger = Logger (service = service_name (), level = log_level .INFO .value , stream = stdout )
159
+
160
+ # WHEN configuration copied from powertools logger to ALL external loggers AND our external logger used
161
+ utils .copy_config_to_registered_loggers (source_logger = powertools_logger )
162
+
163
+ # THEN
164
+ assert len (logger .handlers ) == 1
165
+ assert type (logger .handlers [0 ]) is logging .StreamHandler
166
+ assert type (logger .handlers [0 ].formatter ) is formatter .LambdaPowertoolsFormatter
0 commit comments