Вход в Python только лог из скрипта - PullRequest
19 голосов
/ 25 ноября 2011

Я использую модуль журналирования Python в своем простом скрипте со следующей настройкой на данный момент.

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S')
logger = logging.getLogger(__name__)

Моя проблема в том, что это также отлавливает сторонние модули, такие как запросы и выходные данные () регистрировать сообщения от них.Можно ли как-то подавить эти сообщения или указать модулю регистрации только регистрировать сообщения из моего собственного сценария?

Ответы [ 2 ]

14 голосов
/ 20 февраля 2018

Приведенный выше ответ не совсем верен - он просто установит планку выше для сообщений, которые будут отображаться из других модулей.

Очень быстрый способ - использовать этот фрагмент кода:

import logging.config
logging.config.dictConfig({
    'version': 1,
    'disable_existing_loggers': True,
})

Вы должны установить это после импорта всех модулей - это отключит все регистраторы, которые были созданы до этого момента,Это будет работать большую часть времени, но некоторые модули создают свой регистратор, например, когда вы создаете экземпляр класса (что произойдет позже в вашем коде).


Когда вы настраиваете регистраторы в соответствии с базовым руководством по питону, они советуют вам использовать logging.basicConfig(...).Это проблема, так как при этом для обработчика (то есть, куда будет перенаправляться журнал) устанавливается значение logging.lastResort, то есть stderr, начиная с Python 3.2 для всех регистраторов глобально в процессе.Это означает, что теперь вы включили полное ведение журнала для всех модулей.

Таким образом, лучшим подходом является создание другого средства ведения журнала только для ваших модулей и предоставление ему некоторых собственных обработчиков вместо использования basicConfig().

Есть два способа сделать это:

1) Все функции:

import logging

log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s", 
                          datefmt="%Y-%m-%d - %H:%M:%S")
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
fh = logging.FileHandler("mylog.log", "w")
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
log.addHandler(ch)
log.addHandler(fh)

Это даст вам регистратор log, который вы затем сможете использовать как log.error("Error found").Он запишет в новый файл mylog.log, а также запишет в sys.stdout.Вы можете изменить это, как вам нравится, конечно.

2) Используя dict:

import logging
import logging.config

DEFAULT_LOGGING = {
    'version': 1,
    'formatters': { 
        'standard': {
            'format': '%(asctime)s %(levelname)s: %(message)s',
            'datefmt': '%Y-%m-%d - %H:%M:%S' },
    },
    'handlers': {
        'console':  {'class': 'logging.StreamHandler', 
                     'formatter': "standard", 
                     'level': 'DEBUG', 
                     'stream': sys.stdout},
        'file':     {'class': 'logging.FileHandler', 
                     'formatter': "standard", 
                     'level': 'DEBUG', 
                     'filename': 'live_detector.log','mode': 'w'} 
    },
    'loggers': { 
        __name__:   {'level': 'INFO', 
                     'handlers': ['console', 'file'], 
                     'propagate': False },
    }
}

logging.config.dictConfig(DEFAULT_LOGGING)
log = logging.getLogger(__name__)

Это даст тот же результат, что и выше, немного дольше, но, возможно, легче читать,Это также автоматически установит 'disable_existing_loggers': True.Если вы не хотите этого, вы должны добавить его и установить в False.

13 голосов
/ 25 ноября 2011

Использование именованных регистраторов в ваших модулях:

import logging
logger = logging.getLogger(__name__)
logger.info("my info")
logger.error("my error")

Вы можете установить уровень журнала для всех других регистраторов, чтобы они были ошибочными, а для ваших регистраторов - для отладки:

import logging
logging.basicConfig(level=logging.ERROR)
logging.getLogger(my_module.__name__).setLevel(logging.DEBUG)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...