Логирование

Что нужно сделать

Реализуйте декоратор logging, который будет отвечать за логирование функций. На экран выводится название функции и её документация. Если во время выполнения декорируемой функции возникла ошибка, то в файл function_errors.log записываются названия функции и ошибки.

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

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

Что оценивается

  • Результат вычислений корректен.
  • Сообщения о процессе получения результата осмыслены и понятны для пользователя.
  • Переменные, функции и собственные методы классов имеют значащие имена (не abcd).
  • Классы и методы/функции имеют прописанную документацию.
  • Есть аннотация типов для методов/функций и их аргументов (кроме args и kwargs). Если функция/метод ничего не возвращает, то используется None.
  • Во всех декораторах используется functools.wraps.
import datetime

def logging(func):
    """Декоратор выводит имя, документацию функций, и записывает ошибки в файл."""
    def inner(*args, **kwargs):
        try:
            print('Имя функции: ', func.__name__)
            print('Документация: ', func.__doc__)
            result = func(*args, **kwargs)
            return result
        except Exception as exception:
            with open('function_errors.log', 'a', encoding='UTF-8') as logfile:
                logfile.writelines(f'''Дата/время: {datetime.datetime.now()}
Функция: "{func.__name__}"
Ошибка: "{exception}"
\n''')

    return inner

@logging
def test1():
    """Документация"""
    print('Функция выполнена.')

@logging
def test2():
    #Документация
    print(Zzzzzzzzzzzz)

@logging
def test3():
    print('Функция выполнена.')

@logging
def test4():
    """Документация"""
    print(Zzzzz)

test1()
test2()
test3()
test4()