Записывать непредвиденные ошибки в файл через модуль регистрации Python - PullRequest
1 голос
/ 27 мая 2020

Я уже довольно давно искал в сети, официальную документацию Python и StackOverflow, но не могу найти правильный ответ.

Я слежу за Python официальный HOWTO по регистрации - мой регистратор выглядит так:

import os, logging
os.chdir("C:/Users/kerfuffle/Desktop/logtest")

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

fh = logging.FileHandler("logging.log")
fh.setLevel(logging.INFO)
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter)

logger.addHandler(fh)
logger.addHandler(sh)

logger.debug("debug!")
logger.info("info!")
logger.warning("warning!")

Последние 3 строки кода работают нормально, у нас также есть правильный вывод через StreamHandler.

logging.log - файл:

2020-05-27 15:41:59,586 - INFO - info!
2020-05-27 15:41:59,586 - WARNING - warning!

вывод консоли:

2020-05-27 15:41:59,584 - DEBUG - debug!
2020-05-27 15:41:59,586 - INFO - info!
2020-05-27 15:41:59,586 - WARNING - warning!

Теперь я не понимаю следующего: если я намеренно создаю ошибку, я ожидайте, что он будет записан в файл. Поэтому я добавляю в свой сценарий еще неизвестную переменную «var»:

var += 1

Я получу стандартный вывод ошибки в консоли рядом с журналом StreamHandler (), как показано выше:

2020-05-27 15:45:37,444 - DEBUG - debug!
2020-05-27 15:45:37,445 - INFO - info!
2020-05-27 15:45:37,451 - WARNING - warning!
Traceback (most recent call last):
  File "c:/Users/kerfuffle/Desktop/logtest/file.py", line 23, in <module>
    var += 1
NameError: name 'var' is not defined

Мой файл журнала показывает только:

2020-05-27 15:45:37,445 - INFO - info!
2020-05-27 15:45:37,445 - WARNING - warning!

Я знаю из руководств, что могу попытаться избежать всего с помощью:

try:
    var += 1
except Exception:
    logger.exception("You moron! Don't do that") #or
    logger.error('What a stupid error!')

Но как я могу поймать ошибки и записывать их в мой файл журнала, которые непредсказуемы или изначально не ожидаются пользователем? (=> так что никаких попыток / except)

Иногда вы просто не знаете об ошибках до того, как они произойдут. Например, если у меня есть скрипт, запущенный через cronjob.

Спасибо за ваши ответы! : -)

1 Ответ

0 голосов
/ 27 мая 2020

Я полагаю, вы ищете следующий флаг: exc_info

try:
    var += 1
except Exception as e:
    logging.critical(e, exc_info=True)

Это захватит сгенерированное сообщение об ошибке и передаст его в журнал. См. Также { ссылка }

...