123 lines
4.3 KiB
Python
123 lines
4.3 KiB
Python
"""
|
||
Конфигурация системы логирования
|
||
"""
|
||
import logging
|
||
import os
|
||
import platform
|
||
from logging.handlers import TimedRotatingFileHandler
|
||
from os import getenv
|
||
|
||
|
||
def is_windows() -> bool:
|
||
"""Проверяет, запущен ли код на Windows"""
|
||
return platform.system().lower() == 'windows'
|
||
|
||
|
||
def setup_logging():
|
||
"""
|
||
Настройка системы логирования с ротацией файлов и выводом в консоль
|
||
"""
|
||
# Создаем каталог logs если он не существует
|
||
if is_windows():
|
||
logs_dir = "logs"
|
||
else:
|
||
logs_dir = "/logs/"
|
||
if not os.path.exists(logs_dir):
|
||
os.makedirs(logs_dir)
|
||
print(f"Created logs directory: {logs_dir}")
|
||
|
||
# Определяем уровень логирования
|
||
if getenv("DEBUG", '0') == '1':
|
||
log_level = logging.INFO
|
||
else:
|
||
log_level = logging.WARNING
|
||
|
||
# Временно включаем детальное логирование для отладки
|
||
log_level = logging.INFO
|
||
|
||
# Создаем основной логгер
|
||
logger = logging.getLogger()
|
||
logger.setLevel(log_level)
|
||
|
||
# Очищаем существующие обработчики
|
||
logger.handlers.clear()
|
||
|
||
# Формат логов
|
||
formatter = logging.Formatter(
|
||
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||
datefmt='%Y-%m-%d %H:%M:%S'
|
||
)
|
||
|
||
# Настройка файлового логирования с ротацией
|
||
file_handler = TimedRotatingFileHandler(
|
||
filename=os.path.join(logs_dir, "salvagedb_bot.log"),
|
||
when='midnight', # Ротация в полночь
|
||
interval=1, # Каждый день
|
||
backupCount=30, # Храним 30 дней
|
||
encoding='utf-8',
|
||
utc=False # Используем локальное время
|
||
)
|
||
file_handler.setLevel(log_level)
|
||
file_handler.setFormatter(formatter)
|
||
file_handler.suffix = "%Y-%m-%d" # Формат суффикса для файлов
|
||
|
||
# Настройка консольного логирования
|
||
console_handler = logging.StreamHandler()
|
||
console_handler.setLevel(log_level)
|
||
console_handler.setFormatter(formatter)
|
||
|
||
# Добавляем обработчики к логгеру
|
||
logger.addHandler(file_handler)
|
||
logger.addHandler(console_handler)
|
||
|
||
# Логируем успешную настройку
|
||
logging.info("=== LOGGING SYSTEM INITIALIZED ===")
|
||
logging.info(f"Log level: {logging.getLevelName(log_level)}")
|
||
logging.info(f"Logs directory: {os.path.abspath(logs_dir)}")
|
||
logging.info(f"Log rotation: daily, keeping 30 days")
|
||
|
||
# Проверяем запуск в Docker
|
||
if os.path.exists('/.dockerenv'):
|
||
logging.info("Running inside Docker container")
|
||
logging.info(f"Container timezone: {getenv('TZ', 'UTC')}")
|
||
logging.info(f"Container user: {getenv('USER', 'unknown')}")
|
||
else:
|
||
logging.info("Running on host system")
|
||
|
||
logging.info("=== LOGGING SETUP COMPLETE ===")
|
||
|
||
|
||
def log_system_info():
|
||
"""
|
||
Логирует информацию о системе при запуске
|
||
"""
|
||
os_name = get_operating_system()
|
||
python_version = platform.python_version()
|
||
architecture = platform.machine()
|
||
|
||
logging.info(f"=== SYSTEM INFORMATION ===")
|
||
logging.info(f"Operating System: {os_name}")
|
||
logging.info(f"Platform: {platform.platform()}")
|
||
logging.info(f"Python Version: {python_version}")
|
||
logging.info(f"Architecture: {architecture}")
|
||
logging.info(f"Node Name: {platform.node()}")
|
||
logging.info(f"os.name: {os.name}")
|
||
logging.info(f"=== END SYSTEM INFO ===")
|
||
|
||
|
||
def get_operating_system() -> str:
|
||
"""
|
||
Определяет операционную систему на которой запущен код
|
||
Returns:
|
||
str: 'Windows', 'Linux', 'macOS' или 'Unknown'
|
||
"""
|
||
system = platform.system().lower()
|
||
|
||
if system == 'windows':
|
||
return 'Windows'
|
||
elif system == 'linux':
|
||
return 'Linux'
|
||
elif system == 'darwin':
|
||
return 'macOS'
|
||
else:
|
||
return f'Unknown ({system})' |