"""
Настройка системы логирования с использованием loguru
"""
import sys
from loguru import logger
from config import config
def setup_logging():
"""Настройка системы логирования"""
# Удаляем стандартный обработчик loguru
logger.remove()
# Настраиваем логирование в stderr для Docker
log_level = "DEBUG" if config.DEBUG else "INFO"
# Основной обработчик для stderr (для Docker)
logger.add(
sys.stderr,
level=log_level,
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
colorize=True,
backtrace=True,
diagnose=True
)
# Дополнительный обработчик для файла (опционально)
if config.DEBUG:
logger.add(
"logs/bot.log",
level="DEBUG",
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
rotation="10 MB",
retention="7 days",
compression="zip",
backtrace=True,
diagnose=True
)
# Настраиваем логирование для внешних библиотек
import logging
# Отключаем логирование aiogram по умолчанию
logging.getLogger("aiogram").setLevel(logging.WARNING)
logging.getLogger("aiohttp").setLevel(logging.WARNING)
logging.getLogger("aiosqlite").setLevel(logging.WARNING)
# Перенаправляем стандартное логирование в loguru
class InterceptHandler(logging.Handler):
def emit(self, record):
# Получаем соответствующий уровень loguru
try:
level = logger.level(record.levelname).name
except ValueError:
level = record.levelno
# Находим caller из логов
frame, depth = logging.currentframe(), 2
while frame.f_code.co_filename == logging.__file__:
frame = frame.f_back
depth += 1
logger.opt(depth=depth, exception=record.exc_info).log(
level, record.getMessage()
)
# Подключаем перехватчик к корневому логгеру
logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)
logger.info("🔧 Система логирования loguru настроена")
logger.info(f"📊 Уровень логирования: {log_level}")
logger.info(f"🐳 Логи выводятся в stderr для Docker")
def get_logger(name: str = None):
"""Получить логгер для модуля"""
if name:
return logger.bind(name=name)
return logger
# Инициализируем логирование при импорте
setup_logging()