| """ |
| Structured Logging for Design System Extractor |
| ================================================ |
| |
| Provides consistent logging across the application using loguru. |
| Falls back to standard logging if loguru is not available. |
| """ |
|
|
| import sys |
| from typing import Optional |
|
|
| try: |
| from loguru import logger as _loguru_logger |
|
|
| |
| _loguru_logger.remove() |
|
|
| |
| _loguru_logger.add( |
| sys.stderr, |
| format="<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{extra[module]}</cyan> | {message}", |
| level="INFO", |
| colorize=True, |
| ) |
|
|
| |
| _loguru_logger.add( |
| "logs/extractor_{time:YYYY-MM-DD}.log", |
| format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {extra[module]} | {message}", |
| level="DEBUG", |
| rotation="10 MB", |
| retention="7 days", |
| compression="gz", |
| catch=True, |
| ) |
|
|
| HAS_LOGURU = True |
|
|
| except ImportError: |
| import logging |
|
|
| HAS_LOGURU = False |
| logging.basicConfig( |
| level=logging.INFO, |
| format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s", |
| datefmt="%H:%M:%S", |
| ) |
|
|
|
|
| def get_logger(module_name: str = "app"): |
| """ |
| Get a logger instance for a specific module. |
| |
| Args: |
| module_name: Name of the module (e.g., 'rule_engine', 'aurora', 'app') |
| |
| Returns: |
| Logger instance with module context |
| """ |
| if HAS_LOGURU: |
| return _loguru_logger.bind(module=module_name) |
| else: |
| return logging.getLogger(module_name) |
|
|
|
|
| |
| app_logger = get_logger("app") |
| rule_engine_logger = get_logger("rule_engine") |
| agent_logger = get_logger("agents") |
| extraction_logger = get_logger("extraction") |
|
|