import logging import functools import time FUNC_LEVEL = 15 logging.addLevelName(FUNC_LEVEL, "FUNC") def func_actions(self, message, *args, **kwargs): if self.isEnabledFor(FUNC_LEVEL): self._log(FUNC_LEVEL, message, args, **kwargs) logging.Logger.func_actions = func_actions # Создаем основной логгер logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # Устанавливаем минимальный уровень логирования # Создаем форматтер formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') # Настройка обработчика для всех сообщений all_file_handler = logging.FileHandler('./files/all.log', encoding='utf-8') all_file_handler.setLevel(logging.DEBUG) # Записываем все уровни all_file_handler.setFormatter(formatter) # Настройка обработчика для ошибок error_file_handler = logging.FileHandler('./files/error.log', encoding='utf-8') error_file_handler.setLevel(logging.ERROR) # Записываем только ошибки error_file_handler.setFormatter(formatter) # Настройка обработчика для консоли console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) console_handler.setFormatter(formatter) # Добавляем все обработчики к логгеру logger.addHandler(all_file_handler) logger.addHandler(error_file_handler) logger.addHandler(console_handler) def log_function_call(func): @functools.wraps(func) def wrapper(*args, **kwargs): logger.func_actions(f"Вызов функции {func.__name__}") start_time = time.perf_counter() try: result = func(*args, **kwargs) end_time = time.perf_counter() execution_time_ms = (end_time - start_time) * 1000 logger.func_actions(f"Функция {func.__name__} завершена за {execution_time_ms:.2f} мс") return result except Exception as e: logger.error(f"Ошибка в функции {func.__name__}: {str(e)}") raise return wrapper