logging.info не відображається на консолі, але попередження та помилки є


94

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

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

На відміну від них, події, зареєстровані за допомогою logging.warndo, відображаються в терміналі.

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

Чи можу я змінити рівень середовища для logging.infoдруку на консолі? Я хочу уникати змін у кожному файлі Python.

Відповіді:


157

Кореневий реєстратор завжди має за замовчуванням рівень ПОПЕРЕДЖЕННЯ. Спробуйте зателефонувати

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

і з тобою повинно бути добре.


1
Ні, вам потрібно зателефонувати лише один раз. Логгер побудований у вигляді ієрархії, і всі журнали зводяться до кореневого реєстратора . Не вказавши жодного аргументу getLogger(), він повертає вам кореневий реєстратор. Поки ви не змінюєте інші реєстратори, вам потрібно лише змінити кореневий реєстратор.
Ztyx

18
Чи знаєте ви, чому logging.basicConfig (рівень = logging.INFO) не працює? Я не бачу цього чітко на документації.
Doppelganger

1
@ P1h3r1e3d13 Якщо у вас є лише один кореневий реєстратор, який, ймовірно, є найкращими практиками, так.
Ztyx 07.03.18

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()працює належним чином?
Шаян Амані,

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або встановив його над ІНФО, тоді консольний реєстратор ніколи нічого не реєструватиме. Якщо я залишу це, basicConfigто я можу телефонувати setLevelна реєстратор цілий день (і я бачу зміну рівня за допомогою дзвінка getEffectiveLevel), але він ніколи не буде реєструвати нічого нижче WARNINGрівня. Я насправді не впевнений, що це не правильна поведінка, але це не те, що я очікував.
Хал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.