# bquant.core.logging_config — Логирование ## Обзор Централизованная система логирования BQuant с **модульной конфигурацией**, **предустановленными профилями** и **гибкими настройками** для различных сценариев использования. Решает проблему дублирования логов в многомодульных скриптах через гранулярный контроль уровней логирования. ## 🎯 Ключевые возможности - **Единый API** - одна функция `setup_logging()` для всех сценариев - **8 предустановленных профилей** - от research до production - **Модульная настройка** - точный контроль по модулям и подмодулям - **Автоматическое наследование** - дочерние логгеры наследуют настройки - **Fluent API** - сложные конфигурации через LoggingConfigurator - **Контекстные логгеры** - автоматическое добавление контекста - **Цветной вывод** - ANSI цвета для консоли ## 📚 Основные функции ### `setup_logging()` - Единая точка конфигурации ```python def setup_logging( level: str = None, # Общий уровень логирования console_level: str = None, # Уровень для консоли file_level: str = None, # Уровень для файла log_to_file: bool = None, # Включить файловое логирование log_file: Union[str, Path] = None, # Путь к файлу логов use_colors: bool = True, # Цветной вывод в консоль console_enabled: bool = True, # Включить консольный вывод reset_loggers: bool = False, # Сбросить существующие логгеры # 🆕 НОВЫЕ ПАРАМЕТРЫ ДЛЯ МОДУЛЬНОГО КОНТРОЛЯ modules_config: Dict[str, Dict[str, str]] = None, # Настройки модулей profile: str = None, # Предустановленный профиль exceptions: Dict[str, str] = None # Исключения для конкретных логгеров ) -> logging.Logger ``` ### `get_logger()` - Получение логгера ```python def get_logger( name: str, # Имя логгера (обычно __name__) context: Dict[str, Any] = None # Контекстная информация ) -> Union[logging.Logger, ContextualLogger] ``` ## 🎨 Предустановленные профили ### Research профили (для NotebookSimulator скриптов) #### `'research'` - Скрытие технических деталей ```python setup_logging(profile='research') ``` **Поведение:** - **Консоль:** WARNING+ (скрывает INFO от data модулей) - **Файл:** INFO+ (сохраняет все детали для отладки) - **Применяется к:** `bquant.data.*`, `bquant.indicators.*`, `bquant.analysis.*` - **Идеально для:** Research скрипты, демонстрации, презентации #### `'clean'` - Минимальный вывод ```python setup_logging(profile='clean') ``` **Поведение:** - **Консоль:** ERROR+ (только ошибки и критические события) - **Файл:** INFO+ (полное логирование для анализа) - **Применяется к:** Все модули BQuant - **Идеально для:** Чистый вывод, минимум шума #### `'debug'` - Отладочный режим ```python setup_logging(profile='debug') ``` **Поведение:** - **Консоль:** DEBUG+ (все детали) - **Файл:** DEBUG+ (максимальная детализация) - **Применяется к:** Все модули BQuant - **Идеально для:** Отладка, разработка, тестирование ### Development профили #### `'verbose'` - Максимальная детализация ```python setup_logging(profile='verbose') ``` **Поведение:** - **Консоль:** DEBUG+ (все сообщения) - **Файл:** DEBUG+ (все детали) - **Применяется к:** Все модули BQuant - **Идеально для:** Разработка, детальная отладка #### `'focused'` - Фокус на core модулях ```python setup_logging(profile='focused') ``` **Поведение:** - **Консоль:** DEBUG для core, INFO для остальных - **Файл:** DEBUG для core, DEBUG для остальных - **Применяется к:** `bquant.core.*` (детально), остальные (стандартно) - **Идеально для:** Разработка core функциональности ### Production профили #### `'critical'` - Только критические события ```python setup_logging(profile='critical') ``` **Поведение:** - **Консоль:** ERROR+ (только ошибки) - **Файл:** ERROR+ (только ошибки) - **Применяется к:** Все модули BQuant - **Идеально для:** Production серверы, минимальный шум #### `'audit'` - Полный аудит ```python setup_logging(profile='audit') ``` **Поведение:** - **Консоль:** ERROR+ (минимум в консоль) - **Файл:** INFO+ (полное логирование для аудита) - **Применяется к:** Все модули BQuant - **Идеально для:** Аудит, compliance, мониторинг ## 🔧 Модульная настройка ### Точный контроль по модулям ```python setup_logging( modules_config={ # Скрыть технические детали data модулей 'bquant.data': { 'console': 'WARNING', # WARNING+ в консоль 'file': 'INFO' # INFO+ в файл }, # Показать детали indicators 'bquant.indicators': { 'console': 'INFO', # INFO+ в консоль 'file': 'DEBUG' # DEBUG+ в файл }, # Максимальная детализация для analysis 'bquant.analysis': { 'console': 'DEBUG', # DEBUG+ в консоль 'file': 'DEBUG' # DEBUG+ в файл } } ) ``` ### Автоматическое наследование Профили автоматически применяются ко всем дочерним логгерам: ```python # Профиль 'research' автоматически применяется к: # - bquant.data.loader # - bquant.data.processor # - bquant.data.validator # - bquant.indicators.macd # - bquant.analysis.zones # и т.д. ``` ## ⚡ Исключения и переопределения ### Снижение уровня для конкретных логгеров ```python setup_logging( profile='research', # Базовый профиль exceptions={ 'bquant.data.loader': 'INFO', # Показать детали загрузки 'bquant.analysis.zones': 'DEBUG', # Отладка анализа зон 'bquant.core.nb': 'INFO' # NotebookSimulator всегда видим } ) ``` ### Приоритет настроек 1. **profile** → базовые настройки 2. **modules_config** → переопределения модулей 3. **exceptions** → индивидуальные исключения ```python # Пример: profile + modules_config + exceptions setup_logging( profile='research', # 1. Базовые настройки modules_config={ # 2. Переопределения 'bquant.analysis': {'console': 'DEBUG'} }, exceptions={ # 3. Исключения 'bquant.data.loader': 'INFO' } ) ``` ## 🚀 LoggingConfigurator - Fluent API ### Сложные конфигурации через цепочку методов ```python from bquant.core.logging_config import LoggingConfigurator # Базовая настройка с профилем configurator = LoggingConfigurator() configurator.preset('notebook', 'research').apply() # Сложная настройка configurator = ( LoggingConfigurator() .preset('development', 'focused') # Базовый preset .module('bquant.data') # Настройка data модуля .console('WARNING') # WARNING+ в консоль .file('DEBUG') # DEBUG+ в файл .module('bquant.indicators') # Настройка indicators .console('ERROR') # ERROR+ в консоль .exception('bquant.data.loader', 'INFO') # Исключение для loader .apply() # Применить настройки ) > **💡 Примечание:** В примерах выше `'notebook'` и `'development'` в `.preset()` можно заменить на любой другой тип окружения - результат будет одинаковым. Важен только второй параметр (профиль). ``` ### Доступные preset типы - `'notebook'` → профили для research скриптов - `'development'` → профили для разработки - `'production'` → профили для production - `'quiet'` → профили для тихих сценариев > **⚠️ Важно:** В текущей реализации BQuant параметр `env_type` (первый параметр в `.preset()`) **не влияет на конечную конфигурацию логирования**. Это означает, что `.preset('notebook', 'research')` и `.preset('development', 'research')` дают одинаковый результат. > > **Планируется:** В будущих версиях `env_type` будет влиять на специфичные настройки для разных окружений: > - `'notebook'` → специальные форматы для Jupyter, отключение дублирования > - `'development'` → подробное логирование в консоль, отладочные форматы > - `'production'` → только файловое логирование, минимум в консоль > - `'quiet'` → подавление всех внешних логгеров ## 📝 Практические примеры ### 1. Research скрипт (скрыть технические детали) ```python from bquant.core.logging_config import setup_logging # Настройка ДО импорта модулей setup_logging(profile='research') # Теперь INFO сообщения от bquant.data.loader скрыты from bquant.data.loader import load_ohlcv_data data = load_ohlcv_data('file.csv') # Только WARNING+ в консоль ``` ### 2. Development (максимальная детализация) ```python from bquant.core.logging_config import setup_logging # Показать все детали для отладки setup_logging(profile='verbose') # Теперь видны все DEBUG сообщения from bquant.indicators.calculators import calculate_macd result = calculate_macd(data) # DEBUG+ в консоль ``` ### 3. Production (только критические события) ```python from bquant.core.logging_config import setup_logging # Минимум шума в production setup_logging(profile='critical') # Только ERROR+ сообщения from bquant.analysis.zones import analyze_zones zones = analyze_zones(data) # Только ошибки в консоль ``` ### 4. Кастомная настройка (точный контроль) ```python from bquant.core.logging_config import setup_logging # Точная настройка для специфичного сценария setup_logging( modules_config={ 'bquant.data': {'console': 'WARNING', 'file': 'INFO'}, 'bquant.indicators': {'console': 'ERROR', 'file': 'DEBUG'}, 'bquant.analysis': {'console': 'INFO', 'file': 'INFO'} }, exceptions={ 'bquant.data.loader': 'INFO', # Показать детали загрузки 'bquant.core.nb': 'INFO' # NotebookSimulator всегда видим } ) ``` ## 🤫 Quiet Init (Phase 4) Чтобы консольные логи были «тихими» по умолчанию в ноутбуках и демо-скриптах, в пакете реализован quiet-init: - Регистрация внешних индикаторов (например, pandas-ta) теперь выполняется в «тихом» контексте (подавление прямого stdout/stderr) и логируется на уровне DEBUG. - Массовые регистрации свернуты в один сводный INFO: - Zone Detection: `Zone detection strategies registered: ...` - External Indicators: `External indicators registered: pandas_ta=N, talib=M` Рекомендуемый пресет для ноутбуков: ```python from bquant.core.logging_config import setup_logging setup_logging( profile='clean', exceptions={'bquant.core.nb': 'INFO'} # базовые сообщения NotebookSimulator видны ) ``` До quiet-init (пример «шумной» консоли): ``` [i] Requires TA-Lib to use 2crows. (pip install TA-Lib) [i] Requires TA-Lib to use 3blackcrows. (pip install TA-Lib) ... INFO - Registered zone detection strategy: zero_crossing INFO - Registered zone detection strategy: threshold ... ``` После quiet-init (свернутые сообщения): ``` INFO - Zone detection strategies registered: combined, line_crossing, preloaded, threshold, zero_crossing INFO - External indicators registered: pandas_ta=157, talib=0 ``` Примечания: - Детальные записи по стратегиям и регистрации индикаторов доступны на уровне DEBUG (профили `debug/verbose`). - Предупреждение об отсутствии TA-Lib остаётся WARNING по умолчанию и может быть скрыто профилем/исключениями при необходимости. ## 🔍 Troubleshooting ### Проблема: INFO сообщения все еще видны **Симптом:** Профиль `research` не скрывает INFO сообщения от `bquant.data.loader` **Решение:** Убедитесь, что профиль применяется **ДО** импорта модулей ```python # ❌ НЕПРАВИЛЬНО - профиль применяется после импорта from bquant.data.loader import load_ohlcv_data setup_logging(profile='research') # Слишком поздно! # ✅ ПРАВИЛЬНО - профиль применяется до импорта from bquant.core.logging_config import setup_logging setup_logging(profile='research') # Сначала настройка from bquant.data.loader import load_ohlcv_data # Потом импорт ``` ### Проблема: Профили не работают **Симптом:** Все профили показывают одинаковое поведение **Решение:** Проверьте, что используете актуальную версию BQuant ```python # Проверьте версию import bquant print(bquant.__version__) # Убедитесь, что импортируете из правильного места from bquant.core.logging_config import setup_logging # ✅ # from bquant.core import setup_logging # ❌ ``` ### Проблема: Логи не записываются в файл **Симптом:** Логи видны в консоли, но не в файле **Решение:** Проверьте настройки файлового логирования ```python # Явно включить файловое логирование setup_logging( profile='research', log_to_file=True, log_file='my_log.txt' ) # Или использовать профиль, который включает файловое логирование setup_logging(profile='research') # Автоматически включает файл ``` ## 📊 Сравнение профилей | Профиль | Консоль | Файл | Применение | |---------|---------|------|------------| | `research` | WARNING+ | INFO+ | Research скрипты, демонстрации | | `clean` | ERROR+ | INFO+ | Минимум шума, тихие сценарии | | `debug` | DEBUG+ | DEBUG+ | Отладка, разработка | | `verbose` | DEBUG+ | DEBUG+ | Максимальная детализация | | `focused` | DEBUG (core), INFO (остальные) | DEBUG | Разработка core функциональности | | `critical` | ERROR+ | ERROR+ | Production, только ошибки | | `audit` | ERROR+ | INFO+ | Аудит, compliance | ## 🔗 Интеграция с NotebookSimulator ### Автоматическая защита NotebookSimulator автоматически защищен от настроек логирования: ```python from bquant.core.nb import NotebookSimulator from bquant.core.logging_config import setup_logging # Настройка логирования НЕ влияет на NotebookSimulator setup_logging(profile='research') nb = NotebookSimulator("Тест") nb.info("Это сообщение ВСЕГДА видно") # ✅ Защищено nb.warning("Это тоже видно") # ✅ Защищено ``` ### Комбинирование с логированием ```python from bquant.core.nb import NotebookSimulator from bquant.core.logging_config import setup_logging # Настройка логирования для технических модулей setup_logging(profile='research') nb = NotebookSimulator("Демонстрация логирования") # Пользовательские сообщения (всегда видны) nb.info("Шаг 1: Загрузка данных") # Технические детали (скрыты профилем research) from bquant.data.loader import load_ohlcv_data data = load_ohlcv_data('file.csv') # INFO сообщения скрыты # Результаты (видны) nb.success(f"Загружено {len(data)} строк") ``` ## 🚀 Миграция с ручной настройки ### Замена множественных вызовов ```python # ❌ СТАРЫЙ СПОСОБ (множественные вызовы) import logging logging.getLogger('bquant.data').setLevel(logging.WARNING) logging.getLogger('bquant.indicators').setLevel(logging.WARNING) logging.getLogger('bquant.analysis').setLevel(logging.INFO) # ✅ НОВЫЙ СПОСОБ (один вызов) from bquant.core.logging_config import setup_logging setup_logging(profile='research') ``` ### Замена кастомных настроек ```python # ❌ СТАРЫЙ СПОСОБ (ручная настройка) import logging for logger_name in ['bquant.data', 'bquant.indicators']: logger = logging.getLogger(logger_name) logger.setLevel(logging.WARNING) # ✅ НОВЫЙ СПОСОБ (модульная настройка) from bquant.core.logging_config import setup_logging setup_logging( modules_config={ 'bquant.data': {'console': 'WARNING'}, 'bquant.indicators': {'console': 'WARNING'} } ) ``` ## 📚 См. также - [NotebookSimulator API](nb.md#logging) - интеграция с логированием - [Data Modules](../data/README.md) - логирование в модулях данных - [Developer Guide](../../developer_guide/README.md) - руководство разработчика - [Best Practices](../../user_guide/best_practices.md) - лучшие практики работы с BQuant ## 🎉 Заключение Система логирования BQuant предоставляет **мощный и гибкий API** для решения всех задач логирования: - **Простота:** Один вызов `setup_logging(profile='research')` для типовых сценариев - **Гибкость:** Точный контроль через `modules_config` и `exceptions` - **Мощность:** Fluent API для сложных конфигураций - **Надежность:** Автоматическое наследование и защита NotebookSimulator Выберите подходящий профиль для вашего сценария или создайте кастомную конфигурацию - BQuant логирование адаптируется под ваши потребности! 🚀