File size: 1,609 Bytes
bfe80c5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
"""Centralized logging configuration."""
from __future__ import annotations
import logging
import sys
from typing import Literal
LogLevel = Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
def setup_logging(
level: LogLevel = "INFO",
*,
format_style: Literal["simple", "detailed", "json"] = "simple",
) -> None:
"""
Configure logging for the application.
Args:
level: Minimum log level
format_style: Output format style
Example:
>>> setup_logging("DEBUG", format_style="detailed")
"""
formats = {
"simple": "%(levelname)s: %(message)s",
"detailed": "%(asctime)s | %(name)s | %(levelname)s | %(message)s",
"json": '{"time": "%(asctime)s", "name": "%(name)s", "level": "%(levelname)s", "message": "%(message)s"}',
}
logging.basicConfig(
level=getattr(logging, level),
format=formats[format_style],
stream=sys.stderr,
force=True,
)
# Reduce noise from libraries
logging.getLogger("urllib3").setLevel(logging.WARNING)
logging.getLogger("httpx").setLevel(logging.WARNING)
logging.getLogger("datasets").setLevel(logging.WARNING)
def get_logger(name: str) -> logging.Logger:
"""
Get a logger for a module.
Args:
name: Logger name (typically __name__)
Returns:
Configured logger instance
"""
# Avoid double-prefixing when __name__ already includes package name
if name.startswith("stroke_deepisles_demo."):
return logging.getLogger(name)
return logging.getLogger(f"stroke_deepisles_demo.{name}")
|