diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..34adde3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +files.* \ No newline at end of file diff --git a/settings/logger.py b/settings/logger.py new file mode 100644 index 0000000..a7aa439 --- /dev/null +++ b/settings/logger.py @@ -0,0 +1,55 @@ +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 diff --git a/utils.py b/utils.py index 4291bbb..aa83821 100644 --- a/utils.py +++ b/utils.py @@ -2,15 +2,42 @@ import os from dotenv import load_dotenv import mysql.connector import json +import functools +from settings.logger import log_function_call, logger load_dotenv() -mydb = mysql.connector.connect( - host=os.getenv('DB_HOST'), - user=os.getenv('DB_USER'), - password=os.getenv('DB_PW'), - database='vok1no' # Добавьте имя базы данных -) +try: + mydb = mysql.connector.connect( + host=os.getenv('DB_HOST'), + user=os.getenv('DB_USER'), + password=os.getenv('DB_PW'), + database='vok1no' + ) +except mysql.connector.Error as e: + print(f"Ошибка при подключении к БД: {e}") + mydb = None + +@log_function_call +def update_sql_connect(): + global mydb # Указываем, что используем глобальную переменную + + if mydb is not None: + try: + mydb.close() + except Exception as e: + print(f"Ошибка при закрытии соединения: {e}") + + try: + mydb = mysql.connector.connect( + host=os.getenv('DB_HOST'), + user=os.getenv('DB_USER'), + password=os.getenv('DB_PW'), + database='vok1no' + ) + except mysql.connector.Error as e: + print(f"Ошибка при переподключении к БД: {e}") + mydb = None def sql_select(sql, val=None): try: @@ -82,4 +109,13 @@ try: res = sql_select('SELECT * FROM sites_logs') print(res) except SystemError as e: - print(e) \ No newline at end of file + print(e) + + +@log_function_call +def test_error(): + result = 10 / 0 + return result + +update_sql_connect() +test_error() \ No newline at end of file