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("Система логирования инициализирована с ротацией и сжатием.")
#
#
#