@@ -148,21 +148,32 @@ def _get_logger(self):
148
148
def _init_logger (self , ** kwargs ):
149
149
"""Configures new logger"""
150
150
151
- # Skip configuration if it's a child logger to prevent
152
- # multiple handlers being attached as well as different sampling mechanisms
153
- # and multiple messages from being logged as handlers can be duplicated
154
- if not self .child :
155
- self ._configure_sampling ()
156
- self ._logger .setLevel (self .log_level )
157
- self ._logger .addHandler (self ._handler )
158
- self .structure_logs (** kwargs )
159
-
160
- logger .debug ("Adding filter in root logger to suppress child logger records to bubble up" )
161
- for handler in logging .root .handlers :
162
- # It'll add a filter to suppress any child logger from self.service
163
- # Where service is Order, it'll reject parent logger Order,
164
- # and child loggers such as Order.checkout, Order.shared
165
- handler .addFilter (SuppressFilter (self .service ))
151
+ # Skip configuration if it's a child logger or a pre-configured logger
152
+ # to prevent the following:
153
+ # a) multiple handlers being attached
154
+ # b) different sampling mechanisms
155
+ # c) multiple messages from being logged as handlers can be duplicated
156
+ is_logger_preconfigured = getattr (self ._logger , "init" , False )
157
+ if self .child or is_logger_preconfigured :
158
+ return
159
+
160
+ self ._configure_sampling ()
161
+ self ._logger .setLevel (self .log_level )
162
+ self ._logger .addHandler (self ._handler )
163
+ self .structure_logs (** kwargs )
164
+
165
+ logger .debug ("Adding filter in root logger to suppress child logger records to bubble up" )
166
+ for handler in logging .root .handlers :
167
+ # It'll add a filter to suppress any child logger from self.service
168
+ # Where service is Order, it'll reject parent logger Order,
169
+ # and child loggers such as Order.checkout, Order.shared
170
+ handler .addFilter (SuppressFilter (self .service ))
171
+
172
+ # as per bug in #249, we should not be pre-configuring an existing logger
173
+ # therefore we set a custom attribute in the Logger that will be returned
174
+ # std logging will return the same Logger with our attribute if name is reused
175
+ logger .debug (f"Marking logger { self .service } as preconfigured" )
176
+ self ._logger .init = True
166
177
167
178
def _configure_sampling (self ):
168
179
"""Dynamically set log level based on sampling rate
0 commit comments