Python регистратор не показывает предупреждения от внешних модулей - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь адаптировать код из https://docs.python.org/3/howto/logging-cookbook.html. Я ожидаю, что все сообщения INFO (а также все более важные сообщения) будут отображаться в терминале, а все сообщения DEBUG (и все выше) будут записаны в файл.

Вот мои настройки ведения журнала:

In main.py:

import logging
import mymodule

def get_logger():
    logger = logging.getLogger("main")
    logger.propagate = False
    logger.setLevel(logging.DEBUG)
    fh = logging.FileHandler('out.log')
    fh.setLevel(logging.DEBUG)
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
    formatter = logging.Formatter('%(asctime)s - %(threadName)s -- %(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    # add the handlers to the logger
    logger.addHandler(fh)
    logger.addHandler(ch)
    return logger

logger = get_logger()
# Do stuff...

In mymodule.py:

import logging
import other_modules

module_logger = logging.getLogger("main.functions")
# Other functions...

Предупреждения, которые запускаются other_modules (которые не написанные мной) не регистрируются, но выводятся на терминал. Что не так с моей настройкой?

ps Я использую функцию для получения logger, чтобы я мог скрыть его в каком-то другом файле и сделать main.py более удобным для пользователя. Не думаю, что это должно иметь негативные побочные эффекты?

1 Ответ

0 голосов
/ 20 июня 2020

Я еще не понял, почему ваше решение не работает - я добавлю к этому позже.

Чтобы отделить конфигурацию ведения журнала от остальной части вашего кода, поместите ее в отдельный модуль и импортируйте этот модуль в модуль верхнего уровня . Все нисходящие потоки будут наследовать через распространение, если специально не настроено.

Похоже, вам нужна одна и та же базовая c конфигурация для всех журналов, поэтому вам нужно только определить конфигурацию root регистратор. В следующем примере имя регистратора root - ''.

log_config.py

import logging, logging.config

config = {'version':1,
          'handlers':{'fyle':{'class' : 'logging.FileHandler',
                              'level' : 'DEBUG',
                              'formatter' : 'primary',
                              'filename' : 'out.log'
                              },
                      'console':{'class' : 'logging.StreamHandler',
                                 'level' : 'INFO',
                                 'formatter' : 'primary',
                                 }
                      },
          'formatters':
          {'primary':{
              'format':'%(asctime)s - %(threadName)s - %(name)s -- %(levelname)s - %(message)s'}
           },
          'loggers': {
              '': {'handlers':['console', 'fyle'],
                       'level':'DEBUG',
                       }
              }
          }

logging.config.dictConfig(config)

Logging HOWTO Advanced: Configuring Logging

main.py

import logging
import log_config
import foo

logger = logging.getLogger('main')
time.sleep(3)
logger.warning('This is tmp')

foo.py

import logging
import time
import bar    # other_modules

module_logger = logging.getLogger("main.functions")
module_logger.propagate = True
time.sleep(1)
module_logger.warning('This is foo!')
module_logger.debug('This is foo! debug')

bar.py (от те другие люди )

import logging
import time

time.sleep(2)
logging.warning('This is bar!!')
logging.debug('this is bar DEBUG')
...