Приведенный выше ответ не совсем верен - он просто установит планку выше для сообщений, которые будут отображаться из других модулей.
Очень быстрый способ - использовать этот фрагмент кода:
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.