2016-11-19 5 views
1

Да, я вижу, что документ python говорит: «Регистраторы никогда не создаются напрямую, а всегда через функцию уровня logging.getLogger (name)», но у меня есть проблема чтобы отлаживать и хотеть знать основную причину.python: разница между logging.Logger и logging.getLogger

вот пример:

#!/usr/bin/python 
import logging 
logger = logging.getLogger("test") 

format = "%(asctime)s [%(levelname)-8s] %(message)s" 
handler = logging.StreamHandler() 
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S")) 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 

logger.info("test") 

Использование logging.getLogger ("тест") здесь, бревенчатый сообщение не будет распечатано.

Если я изменю logging.getLogger («test») на logging.Logger («test»), будет выведено сообщение журнала.

#!/usr/bin/python 
import logging 
logger = logging.Logger("test") 

format = "%(asctime)s [%(levelname)-8s] %(message)s" 
handler = logging.StreamHandler() 
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S")) 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 

logger.info("test") 

Или мы можем с помощью logging.getLogger ("тест") уровень и набор логгер для logging.DEBUG.

#!/usr/bin/python 
import logging 
logger = logging.getLogger("test") 

format = "%(asctime)s [%(levelname)-8s] %(message)s" 
handler = logging.StreamHandler() 
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S")) 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 
logger.setLevel(logging.DEBUG) 

logger.info("test") 

ответ

2

Метод .getLogger("test") ищет любые существующие конфигурации регистратора для имени "test" в то время как .Logger("test") создает регистратор по умолчанию с именем "test" и устанавливает уровень журнала по умолчанию 0. Если метод getLogger не находит класс регистратора по этому имени, тогда он создаст базовый регистратор, который будет иметь эффективный уровень 30 (https://docs.python.org/3/library/logging.html#logging-levels), который будет игнорировать ваше сообщение DEBUG. Вы можете проверить через logger.getEffectiveLevel(), чтобы заметить разницу.

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

+0

похоже, что не объясняет, почему сообщение печатается при использовании Logger («test»), но не getLogger («test»). Оба они получают объект logging.Logger с уровнем журнала 0. – vts

+0

См. Edit, не понимал, что раздел его был отключен, когда я отправил. – ioneyed

+0

Спасибо, ioneyed, я вижу разницу после проверки logger.getEffectiveLevel(), .Logger («test») не будет наследоваться ни от одного регистратора, в то время как .getLogger («test») наследует от корневого регистратора, который имеет уровень журнала по умолчанию == 30. – vts

Смежные вопросы