logging.info не отображается на консоли, но отображается предупреждение и ошибка

94

Когда я регистрирую событие с помощью logging.info, оно не отображается в терминале Python.

import logging
logging.info('I am info')  # no output

Напротив, события, зарегистрированные с помощью, logging.warnдействительно появляются в терминале.

import logging
logging.warn('I am warning')  # outputs "I am warning"

Есть ли изменение уровня среды, которое я могу сделать для logging.infoпечати на консоли? Я хочу избежать внесения изменений в каждый файл Python.

мечтатель
источник

Ответы:

157

Корневой регистратор всегда по умолчанию находится на уровне ПРЕДУПРЕЖДЕНИЕ. Попробуйте позвонить

logging.getLogger().setLevel(logging.INFO)

и все должно быть в порядке.

Ztyx
источник
1
Нет, вам нужно позвонить только один раз. Регистратор построен в виде иерархии, и все ведение журнала сводится к корневому регистратору . Если не указать никаких аргументов getLogger(), он возвращает вам корневой регистратор. Пока вы не изменяете другие регистраторы, вам нужно изменить только корневой регистратор.
Ztyx
18
Вы знаете, почему logging.basicConfig (level = logging.INFO) не работает? Я не могу четко увидеть это в документации.
Doppelganger
1
@ P1h3r1e3d13 Если у вас есть только один корневой регистратор, это, вероятно, лучший метод, да.
Ztyx 07
7
Это не работает на Python 3.5:Python 3.5.2 (default, Nov 12 2018, 13:43:14) [GCC 5.4.0 20160609] on linux >>> import logging >>> rootLog = logging.getLogger() >>> rootLog.setLevel(logging.INFO) >>> rootLog.info('all the kings horses') >>> rootLog.warning('all the kings men') all the kings men
Джефф К.
6
@jeffk, то же самое и со мной 3.6.8 не печатает информационные сообщения, даже если для setLevel задано ведение журнала. INFO
Роберт Лугг,
28

Как @ztyx сказал, что уровень ведения журнала по умолчанию - ПРЕДУПРЕЖДЕНИЕ. Вы должны установить его на более низкий уровень

Вы можете сделать это, используя logging.basicConfig и установив уровень ведения журнала :

logging.basicConfig(level=logging.DEBUG)
Влад Безден
источник
7
Мне интересно, почему basicConfig()у меня не работает, хотя logging.getLogger().setLevel()подходит?
Amani
17

Вышеупомянутые решения не сработали для меня, но код здесь :

# set up logging to file
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

(Я пропустил части кода для удобства чтения)

Орли
источник
1
Это единственное, что у меня сработало. У меня была строка с logging.error("Connection timed out!")и даже с level=logging.DEBUGв basicConfig(), она не печаталась на консоли. Добавление обработчика, большое спасибо !!
BruceWayne
Имейте в виду, что обработчик, который вы используете, играет роль. Если, например, в вашем коде есть NullHandler, ничего не будет напечатано независимо от рычага регистрации.
Джордж
То же самое и здесь - если я опущу аргумент уровня basicConfigили установлю его выше INFO, тогда регистратор консоли никогда ничего не будет регистрировать. Если я пропущу, basicConfigя могу звонить setLevelна регистратор весь день (и я могу видеть изменение уровня, позвонив getEffectiveLevel), но он никогда не будет регистрировать что-либо ниже WARNINGуровня. Я не совсем уверен, что это неправильное поведение, но это не то, что я ожидал.
Хэл,