This commit is contained in:
2026-02-20 08:34:50 +07:00
parent 5aca4e8438
commit 4d1b8911b3
4 changed files with 274 additions and 162 deletions

View File

@@ -1,5 +1,5 @@
"""
Кастомный логгер с поддержкой декораторов и прямого вызова
Кастомный логгер с поддержством декораторов и прямого вызова
"""
from sys import stderr
from pathlib import Path
@@ -43,7 +43,6 @@ class Logger:
'<cyan>{extra[user]}</cyan> <red>|</red> <level>{message}</level>'
)
def __init__(self, system_name: str = 'PRIMO') -> None:
"""
Инициализация логгера.
@@ -58,6 +57,11 @@ class Logger:
"""
Настройка обработчиков Loguru: консоль и файлы.
Учитывает переменную LOG_LEVEL из settings.
LOG_LEVEL определяет минимальный уровень для консоли и общего файла,
а также влияет на то, какие отдельные файлы создаются:
создаются только файлы для уровней >= LOG_LEVEL.
Args:
start: Если True, сразу логирует запуск проекта
"""
@@ -67,6 +71,15 @@ class Logger:
# Полная очистка настроек
nlogger.remove()
# Определяем уровень логирования из настроек
log_level_str = getattr(settings, 'LOG_LEVEL', 'INFO').upper()
# Проверка на допустимость
try:
log_level_no = nlogger.level(log_level_str).no
except ValueError:
log_level_str = 'INFO'
log_level_no = nlogger.level('INFO').no
# Создание директории для файловых логов
log_dir: Path = settings.LOG_DIR
if not log_dir.exists():
@@ -78,45 +91,49 @@ class Logger:
sink=stderr,
format=self._log_format,
colorize=True,
level='INFO',
level=log_level_str,
filter=lambda rec: rec['extra'].get('log_type') != 'TRACE'
)
# Файловые логи
if settings.LOG_FILE:
# Общий лог со всеми уровнями
# Общий лог со всеми уровнями (начиная с LOG_LEVEL)
nlogger.add(
sink=log_dir / 'bot.log',
rotation=settings.LOG_ROTATION,
retention=settings.LOG_RETENTION,
format=self._log_format,
level='DEBUG',
level=log_level_str,
enqueue=True,
backtrace=True,
diagnose=True,
encoding='utf-8'
)
# Раздельные логи по уровням
log_levels = {
'INFO': 'info.log',
'WARNING': 'warning.log',
'ERROR': 'error.log',
'CRITICAL': 'critical.log'
}
# Раздельные логи по уровням создаём только для уровней >= LOG_LEVEL
# Список интересующих нас уровней (в порядке возрастания)
level_configs = [
('DEBUG', 'debug.log'),
('INFO', 'info.log'),
('SUCCESS', 'success.log'),
('WARNING', 'warning.log'),
('ERROR', 'error.log'),
('CRITICAL', 'critical.log')
]
for level_name, filename in log_levels.items():
nlogger.add(
sink=log_dir / filename,
rotation='10 MB',
retention=settings.LOG_RETENTION,
format=self._log_format,
level=level_name,
filter=lambda rec, lvl=level_name: rec['level'].name == lvl,
enqueue=True,
encoding='utf-8'
)
for level_name, filename in level_configs:
level_no = nlogger.level(level_name).no
if level_no >= log_level_no:
nlogger.add(
sink=log_dir / filename,
rotation='10 MB',
retention=settings.LOG_RETENTION,
format=self._log_format,
level=level_name,
filter=lambda rec, lvl=level_name: rec['level'].name == lvl,
enqueue=True,
encoding='utf-8'
)
self._setup_done = True
@@ -128,7 +145,6 @@ class Logger:
log_type='START'
)
@staticmethod
def format_user(event: Optional[EventType] = None) -> str:
"""
@@ -322,8 +338,8 @@ class Logger:
user: Optional[str] = None,
message: Optional[EventType] = None
) -> None:
"""Логирование успешного выполнения (уровень INFO)"""
self.log_entry('INFO', f"{text}", log_type, user, message)
"""Логирование успешного выполнения (уровень SUCCESS)"""
self.log_entry('SUCCESS', text, log_type, user, message)
# ================= КОНТЕКСТНЫЕ МЕНЕДЖЕРЫ =================