| | """ |
| | 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") |
| |
|