Testing/settings/logger.py

56 lines
2.2 KiB
Python

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