diff --git a/src/core/logging_config.py b/src/core/logging_config.py index 9fe42fd..abd59e8 100644 --- a/src/core/logging_config.py +++ b/src/core/logging_config.py @@ -3,26 +3,44 @@ # import logging import os +import gzip +import shutil +from logging.handlers import RotatingFileHandler from pathlib import Path from typing import Optional from .database import DatabaseLogHandler, DatabaseManager from .settings import settings # +# +class GzipRotator: + def __call__(self, source: str, dest: str) -> None: + try: + with open(source, 'rb') as f_in: + with gzip.open(dest, 'wb') as f_out: + shutil.copyfileobj(f_in, f_out) + os.remove(source) + except Exception as e: + print(f"Ошибка при сжатии лог-файла: {e}") + +def namer(name: str) -> str: + return name + ".gz" +# + # -# description: "Настраивает логирование, опционально добавляя обработчик для записи в базу данных." +# description: "Настраивает логирование с ротацией и сжатием, опционально добавляя обработчик для записи в базу данных." # preconditions: # - "run_id должен быть строкой." # - "db_manager должен быть экземпляром DatabaseManager или None." # postconditions: -# - "Базовая конфигурация логирования настроена." +# - "Базовая конфигурация логирования настроена с ротацией и сжатием." # - "Если log_to_db is True и db_manager предоставлен, добавляется обработчик для БД." # exceptions: # - "Может возникнуть исключение при ошибке инициализации обработчика БД." # # def setup_logging(run_id: str, db_manager: Optional[DatabaseManager] = None): - """Настраивает систему логирования проекта.""" + """Настраивает систему логирования проекта с ротацией и сжатием.""" # log_format = '[%(asctime)s] [%(levelname)s] :: %(message)s' handlers = [] @@ -33,11 +51,24 @@ def setup_logging(run_id: str, db_manager: Optional[DatabaseManager] = None): # # - # Добавляем обработчик для записи логов в файл. + # Добавляем обработчик для записи логов в файл с ротацией и сжатием. log_file_name = f"run_{run_id}.log" - file_handler = logging.FileHandler(settings.log_dir / log_file_name, mode='w', encoding='utf-8') + log_file_path = settings.log_dir / log_file_name + + # Используем RotatingFileHandler для управления размером лог-файлов. + # 10 MB per file, 5 backup files + file_handler = RotatingFileHandler( + log_file_path, maxBytes=10*1024*1024, backupCount=5, encoding='utf-8' + ) file_handler.setLevel(logging.INFO) file_handler.setFormatter(logging.Formatter(log_format)) + + # + # Добавляем сжатие для ротированных файлов + file_handler.rotator = GzipRotator() + file_handler.namer = namer + # + handlers.append(file_handler) # @@ -65,7 +96,7 @@ def setup_logging(run_id: str, db_manager: Optional[DatabaseManager] = None): if any(isinstance(h, DatabaseLogHandler) for h in handlers): logging.info("Обработчик логов для записи в базу данных успешно добавлен.") - logging.info("Система логирования инициализирована.") + logging.info("Система логирования инициализирована с ротацией и сжатием.") # # #