Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Реализуйте декоратор logging, который будет отвечать за логирование функций.

PKBel Знаток (309), на голосовании 1 год назад
На экран выводится название функции и её документация. Если во время выполнения декорируемой функции возникла ошибка, то в файл function_errors.log записываются названия функции и ошибки.

Также постарайтесь сделать так, чтобы программа не завершалась после обнаружения первой же ошибки, а обрабатывала все декорируемые функции и сразу записывала все ошибки в файл.

Дополнительно: запишите дату и время возникновения ошибки, используя модуль datetime.

В декораторе используется functools.wraps
Голосование за лучший ответ
Eduardus Профи (506) 1 год назад
Для решения этой задачи можно использовать декоратор 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: Отрицательное число

В данном примере мы использовали декоратор, который логирует работу функций и записывает ошибки в файл. Декоратор не останавливает программу после обнаружения первой ошибки и продолжает работу с остальными функциями.
Похожие вопросы