Я добавил новый регистратор my_logger, который объявляется и создается в файле с именем my_logging.py
Я вижу, что регистратор может правильно заполнять файл журнала сообщениями
Код: Выделить всё
my_logger.info("message from my_logger.info")
Вот несколько сценариев:
В файле html-шаблона моего проекта customer_file.hip есть следующие сценарии:
сценарий 1 — синтаксическая ошибка
customer_file.hip
Код: Выделить всё
from my_logging import my_logger
import sys, traceback
...
try:
my_logger.info("my_logger.info - I am going to raise a exception inside a 'try' block.")
hello, this line triggers a handled error
except Exception:
my_logger.info("exception for file {}, name {}".format(__file__, __name__))
traceback.print_exc(file=sys.stderr)
my_logger.info("Logged the exception traceback.")
обратная трассировка печатается в браузере, когда я пытаюсь получить доступ к странице, отображаемой моим шаблоном, но нет в моем файле журнала.

сценарий 2 – необработанный исключение
customer_file.hip
Код: Выделить всё
from my_logging import my_logger
import sys, traceback
...
my_logger.info("my_logger.info - I am going to raise an unhandled exception.")
new_variable = undeclared_variable
my_logger.info("this line of code is never reached.")
только я собираюсь вызвать необработанное исключение печатается в моем файле журнала.
сценарий 3 — обработанное исключение
customer_file.hip
Код: Выделить всё
from my_logging import my_logger
import sys, traceback
...
try:
my_logger.info("my_logger.info - I am going to raise a exception inside a 'try' block.")
new_variable = undeclared_variable
my_logger.info("this line of code is never reached.")
except Exception:
my_logger.info("exception for file {}, name {}".format(__file__, __name__))
traceback.print_exc(file=sys.stderr)
my_logger.info("Logged the exception traceback.")
только я собираюсь вызвать исключение внутри блока 'try' печатается в моем файле журнала.
Ниже приведен код my_logging.py, как я могу изменить его, чтобы отслеживать как обработанные, так и необработанные исключения?
my_logging.py
Код: Выделить всё
import os
import datetime
import sys
import traceback
import logging
from logging.handlers import TimedRotatingFileHandler
def setup_logger():
##############
# stdout part
##############
# log filename
# --------------
log_dir = "/home/myuser/var/log/my_project"
log_filename = "my_project.log"
log_file_path = os.path.join(log_dir, log_filename)
# log directory
# ---------------
if not os.path.exists(log_dir):
try:
os.makedirs(log_dir)
except OSError as e:
if e.errno != 17: # Errno 17 = "File exists"
raise # raise exception if the error is not "file exists"
# logger name
# --------------
logger_1 = logging.getLogger("my_project_logger")
# logger level
# --------------
logger_1.setLevel(logging.DEBUG) # logger's level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
# Formatter
# -----------
formatter_1 = logging.Formatter(
"[%(asctime)s %(name)s] %(message)s"
# %(levelname)s
)
# File handler
# --------------
# define a rotating File Handler
file_handler_1 = TimedRotatingFileHandler(
log_file_path,
when="midnight",
interval=1,
backupCount=7
)
return logger_1
# instantiate the logger
my_logger = setup_logger()
Я пытался добавить глобальный обработчик для неперехваченных выражений:
в my_logging.py, в конце, после строки
Код: Выделить всё
my_logger = setup_logger()
Код: Выделить всё
def handle_exception(exc_type, exc_value, exc_traceback):
if issubclass(exc_type, KeyboardInterrupt):
sys.__excepthook__(exc_type, exc_value, exc_traceback)
return
my_logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))
sys.excepthook = handle_exception
Подробнее здесь: https://stackoverflow.com/questions/792 ... exceptions