[issue34999] Different behavior of copied loggers in 3.7

Vinay Sajip report at bugs.python.org
Wed Oct 17 00:10:17 EDT 2018


Vinay Sajip <vinay_sajip at yahoo.co.uk> added the comment:

This doesn't appear to be inherently a logging problem - it seems to be a change in how copy.copy() is working. If you update mocked_log to insert some statements showing the id of the loggers involved in the copy:

def mocked_log(log_level):
    # Return a copy as the bot may modify the logger and we should always return the intial logger
    print('copying   %x' % id(logger))
    assert logger.handlers
    logger_new = copy.copy(logger)
    logger_new.setLevel(log_level)
    print('copied to %x' % id(logger_new))
    return logger_new

Then under Python3.6 you get something like

copying   7f2682b3a780
copied to 7f268145bc50
copying   7f2682b3a780
copied to 7f268145bcf8
INFO - Initialized
DEBUG - test
INFO - Bot stopped.

Note the different ids of the copy source and target, and that the assertion failure isn't triggered. Under 3.7, you get

copying   7f7084171b38
copied to 7f7084171b38
copying   7f7084171b38
Traceback (most recent call last):
  File "test.py", line 31, in <module>
    bot = Bot()
  File "/home/vinay/projects/scratch/python/34999/bot.py", line 12, in __init__
    self.__init_logger(logging_level='DEBUG')
  File "/home/vinay/projects/scratch/python/34999/bot.py", line 17, in __init_logger
    self.logger = log(log_level=logging_level)
  File "test.py", line 23, in mocked_log
    assert logger.handlers
AssertionError

So - copy.copy() hasn't actually made a copy of the logger, it's returned the original. I'm not sure why this is.

----------

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue34999>
_______________________________________


More information about the Python-bugs-list mailing list