@@ -148,21 +148,32 @@ def _get_logger(self):
148148 def _init_logger (self , ** kwargs ):
149149 """Configures new logger"""
150150
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
166177
167178 def _configure_sampling (self ):
168179 """Dynamically set log level based on sampling rate
0 commit comments