v1.2.0
This commit is contained in:
@@ -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)
|
||||
|
||||
# ================= КОНТЕКСТНЫЕ МЕНЕДЖЕРЫ =================
|
||||
|
||||
|
||||
Reference in New Issue
Block a user