Это потому, что вы пытаетесь получить регистратор через __name__
, который не "__main__"
, а "my_module". У вас нет ключа для этого, так что регистратор не настроен. Измените ваш getLogger
, чтобы он вызывал правильное имя, sLogger
, и он выбирает правильное:
import logging
def foo():
# here
logger = logging.getLogger("sLogger")
logger.info('Hi, foo')
class Bar(object):
def __init__(self, logger=None):
# or here
self.logger = logger or logging.getLogger("sLogger")
def bar(self):
self.logger.info('Hi, bar')
self.logger.debug('Testing')
. Вызывает регистратор по названию, которое вы ему дали (key
, на которое он указывает в INI-файл). И теперь ваш display_info.log
файл должен выглядеть следующим образом:
# display_info.log
2020-03-07 22:14:45,351 - sLogger - INFO - Hi, foo
2020-03-07 22:14:45,351 - sLogger - INFO - Hi, bar
2020-03-07 22:14:45,351 - sLogger - DEBUG - Testing
Причина в том, что каждому регистратору присваивается имя, поэтому, когда вы вызываете logging.getLogger(<some_name>)
, этот регистратор буквально называется именем, которое вы ему дали. Затем, когда вы вызываете этот логгер из других модулей, он уже доступен.
Атрибут __name__
- это не имя регистратора, а имя сценария, который вы запускаете. Когда вы звоните python somescript.py
, somescript.__name__
- это __main__
, потому что это основной вызываемый модуль. Но при импорте __name__
- это имя модуля, потому что он не выполняется. Таким образом, в действительности все происходило следующим образом:
import logging
''' these two are created when you load the .ini file '''
# this is aliased as root
main_logger = logging.getLogger("__main__")
~ some logging configuration ~
# the other logger you configured
sLogger = logging.getLogger("sLogger")
~ some logging configuration ~
''' and are in global scope in the main script '''
# and the logger you were getting by mistake
logger = logging.getLogger("my_module")
# when you really meant to do this
# which is the same thing as sLogger
logger = logging.getLogger("sLogger")
В качестве альтернативы, если вы хотите сохранить синтаксис __name__
и иметь логгеры для модуля c, то вы просто добавляете имена Модули в качестве квалификационных имен:
# logging.ini
~ snip ~
[logger_sLogger]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=my_module
propagate=0
~ rest of file ~
И вы можете сохранить logging.getLogger(__name__)
вызов:
# my_module.py
import logging
def foo():
logger = logging.getLogger(__name__)
logger.info('Hi, foo')
class Bar(object):
def __init__(self, logger=None):
self.logger = logger or logging.getLogger(__name__)
def bar(self):
self.logger.info('Hi, bar')
self.logger.debug('Testing')