2025-etpgrf/etpgrf/logger.py
2025-05-13 23:52:50 +03:00

122 lines
8.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# etpgrf/logging_settings.py
import logging
from etpgrf.defaults import etpgrf_settings # Импортируем наш объект настроек по умолчанию
# --- Корневой логгер для всей библиотеки etpgrf ---
# Имя логгера "etpgrf" позволит пользователям настраивать
# логирование для всех частей библиотеки.
# Например, logging.getLogger("etpgrf").setLevel(logging.DEBUG)
# или logging.getLogger("etpgrf.hyphenation").setLevel(logging.INFO)
_etpgrf_init_logger = logging.getLogger("etpgrf")
# --- Настройка корневого логгера ---
def setup_library_logging():
"""
Настраивает корневой логгер для библиотеки etpgrf.
Эту функцию следует вызывать один раз (например, при импорте
основного модуля библиотеки или при первом обращении к логгеру).
"""
# Проверяем инициализацию хандлеров логера, чтобы случайно не добавлять хендлеры многократно
if not _etpgrf_init_logger.hasHandlers():
log_level_to_set = logging.WARNING # Значение по умолчанию
log_format_to_set = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' # Формат по умолчанию
fin_message: str | None = None
if hasattr(etpgrf_settings, 'logging_settings'):
if hasattr(etpgrf_settings.logging_settings, 'LEVEL'):
log_level_to_set = etpgrf_settings.logging_settings.LEVEL
if hasattr(etpgrf_settings.logging_settings, 'FORMAT') and etpgrf_settings.logging_settings.FORMAT:
log_format_to_set = etpgrf_settings.logging_settings.FORMAT
else:
# Этого не должно происходить, если defaults.py настроен правильно
fin_message= "ПРЕДУПРЕЖДЕНИЕ: etpgrf_settings.logging_settings не найдены при начальной настройке логгера."
_etpgrf_init_logger.setLevel(log_level_to_set) # Устанавливаем уровень логирования
console_handler = logging.StreamHandler() # Создаем хендлер вывода в консоль
console_handler.setLevel(log_level_to_set) # Уровень для хендлера тоже
formatter = logging.Formatter(log_format_to_set) # Создаем форматтер для вывода
console_handler.setFormatter(formatter) # Устанавливаем форматтер для хендлера
_etpgrf_init_logger.addHandler(console_handler) # Добавляем хендлер в логгер
if fin_message is not None:
# Если есть сообщение об отсутствии настроек в `etpgrf_settings`, выводим его
_etpgrf_init_logger.warning(fin_message)
_etpgrf_init_logger.debug(f"Корневой логгер 'etpgrf' инициализирован."
f" Уровень: {logging.getLevelName(_etpgrf_init_logger.getEffectiveLevel())}")
# --- Динамическое изменение уровня логирования ---
def update_etpgrf_log_level_from_settings():
"""
Обновляет уровень логирования для корневого логгера `etpgrf` и его
обработчиков, читая значение из `etpgrf_settings.logging_settings.LEVEL`.
"""
# Проверяем, что настройки логирования и уровень существуют в `defaults.etpgrf_settings`
if not hasattr(etpgrf_settings, 'logging_settings') or \
not hasattr(etpgrf_settings.logging_settings, 'LEVEL'):
_etpgrf_init_logger.warning("Невозможно обновить уровень логгера: `etpgrf_settings.logging_settings.LEVEL`"
" не найден.")
return
new_level = etpgrf_settings.logging_settings.LEVEL
_etpgrf_init_logger.setLevel(new_level)
for handler in _etpgrf_init_logger.handlers:
handler.setLevel(new_level) # Устанавливаем уровень для каждого хендлера
_etpgrf_init_logger.info(f"Уровень логирования `etpgrf` динамически обновлен на:"
f" {logging.getLevelName(_etpgrf_init_logger.getEffectiveLevel())}")
# --- Динамическое изменение формата логирования ---
def update_etpgrf_log_format_from_settings():
"""
Обновляет формат логирования для обработчиков корневого логгера etpgrf,
читая значение из etpgrf_settings.logging_settings.FORMAT.
"""
if not hasattr(etpgrf_settings, 'logging_settings') or \
not hasattr(etpgrf_settings.logging_settings, 'FORMAT') or \
not etpgrf_settings.logging_settings.FORMAT:
_etpgrf_init_logger.warning("Невозможно обновить формат логгера: `etpgrf_settings.logging_settings.FORMAT`"
" не найден или пуст.")
return
new_format_string = etpgrf_settings.logging_settings.FORMAT
new_formatter = logging.Formatter(new_format_string)
for handler in _etpgrf_init_logger.handlers:
handler.setFormatter(new_formatter) # Применяем новый форматтер к каждому хендлеру
_etpgrf_init_logger.info(f"Формат логирования для 'etpgrf' динамически обновлен на: '{new_format_string}'")
# --- Инициализация логгера при первом импорте ---
setup_library_logging()
# --- Предоставление логгеров для модулей ---
def get_logger(name: str) -> logging.Logger:
"""
Возвращает логгер для указанного имени.
Обычно используется как logging.getLogger(__name__) в модулях.
Имя будет дочерним по отношению к "etpgrf", например, "etpgrf.hyphenation".
"""
# Убедимся, что имя логгера начинается с "etpgrf." для правильной иерархии,
# если только это не сам корневой логгер.
if not name.startswith("etpgrf") and name != "etpgrf":
# Это может быть __name__ из модуля верхнего уровня, использующего библиотеку. В этом случае мы не хотим
# делать его дочерним от "etpgrf" насильно. Просто вернем логгер с именем...
# Либо можно настроить, что все логгеры, получаемые через эту функцию, должны быть частью иерархии "etpgrf"...
# Для простоты оставим так:
pass # logging_settings = logging.getLogger(name)
# Более правильный подход для модулей ВНУТРИ библиотеки etpgrf: они должны вызывать `logging.getLogger(__name__)`
# напрямую. Тогда эта функция `get_logger()` может быть и не нужна, если модули ничего не делают кроме:
# import logging
# logging_settings = logging.getLogger(__name__)
#
# Однако, если нужно централизованно получать логгеры, можно сделать, чтобы `get_logger()` всегда возвращал
# дочерний логгер:
# if not name.startswith("etpgrf."):
# name = f"etpgrf.{name}"
return logging.getLogger(name)