Для решения этой задачи можно использовать декоратор logging, который обернет декорируемую функцию и будет логировать её работу. В декораторе будем использовать модули logging и datetime.
Перед использованием декоратора необходимо настроить логгирование. Для этого создадим объект logging.getLogger() и настроим его уровень логгирования на DEBUG.
Вот пример реализации декоратора logging:
import logging
import functools
import datetime
# настроим логгирование
logging.basicConfig(level=logging.DEBUG)
def logging_decorator(func):
@functools.wraps(func)
def wrapper(_args, _*kwargs):
# выведем название и документацию функции
logging.debug(f'Вызов функции {func.__name__}')
logging.debug(f'Документация функции {func.__doc__}')
# выполним декорируемую функцию
try:
result = func(_args, _*kwargs)
return result
except Exception as e:
# запишем ошибку в журнал
logging.error(f'Ошибка при выполнении функции {func.__name__}: {e}')
log_error(func.__name__, str(e))
# вернем исключение
raise e
# записываем ошибку в файл
def log_error(func_name, error):
date_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open('function_errors.log', 'a') as f:
f.write(f'{date_time} - {func_name}: {error}n')
return wrapper
Пример использования декоратора logging:
# декорируемые функции
@logging_decorator
def divide(a, b):
"""Деление чисел"""
return a / b
@logging_decorator
def power(a, b):
"""Возведение в степень"""
return a __ b
@logging_decorator
def square_root(a):
"""Квадратный корень"""
if a >= 0:
return a __ 0.5
else:
raise ValueError('Отрицательное число')
# вызываем функции
print(divide(4, 2))
print(power(3, 4))
print(square_root(16))
print(square_root(-9))
В данном примере мы добавляем декоратор logging_decorator к трём функциям: divide, power и square_root. Декоратор логирует вызовы функций и записывает ошибки в файл function_errors.log.
Вывод журнала логгирования:
DEBUG:root:Вызов функции divide
DEBUG:root:Документация функции Деление чисел
DEBUG:root:Вызов функции power
DEBUG:root:Документация функции Возведение в степень
DEBUG:root:Вызов функции square_root
DEBUG:root:Документация функции Квадратный корень
DEBUG:root:Вызов функции square_root
DEBUG:root:Документация функции Квадратный корень
ERROR:root:Ошибка при выполнении функции square_root: math domain error
ERROR:root:Ошибка при выполнении функции square_root: Отрицательное число
Содержимое файла function_errors.log:
2022-01-01 00:00:00 - square_root: math domain error
2022-01-01 00:00:00 - square_root: Отрицательное число
В данном примере мы использовали декоратор, который логирует работу функций и записывает ошибки в файл. Декоратор не останавливает программу после обнаружения первой ошибки и продолжает работу с остальными функциями.
Также постарайтесь сделать так, чтобы программа не завершалась после обнаружения первой же ошибки, а обрабатывала все декорируемые функции и сразу записывала все ошибки в файл.
Дополнительно: запишите дату и время возникновения ошибки, используя модуль datetime.
В декораторе используется functools.wraps