"""Logging configuration for local-deepwiki."""
import logging
import os
import sys
from typing import Literal
# Package-level logger
PACKAGE_NAME = "local_deepwiki"
# Log format with structured information
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
LOG_FORMAT_DETAILED = (
"%(asctime)s - %(name)s - %(levelname)s - " "[%(filename)s:%(lineno)d] %(message)s"
)
def setup_logging(
level: str | int | None = None,
format_style: Literal["simple", "detailed"] = "simple",
stream: bool = True,
log_file: str | None = None,
) -> logging.Logger:
"""Configure logging for the local-deepwiki package.
Args:
level: Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL).
Defaults to INFO, or DEEPWIKI_LOG_LEVEL env var.
format_style: "simple" for basic format, "detailed" for file/line info.
stream: Whether to log to stderr.
log_file: Optional file path for logging.
Returns:
The configured root logger for the package.
"""
# Determine log level
if level is None:
level = os.environ.get("DEEPWIKI_LOG_LEVEL", "INFO")
if isinstance(level, str):
level = getattr(logging, level.upper(), logging.INFO)
# At this point level is guaranteed to be an int
log_level: int = level if isinstance(level, int) else logging.INFO
# Get the package logger
logger = logging.getLogger(PACKAGE_NAME)
logger.setLevel(log_level)
# Clear existing handlers to avoid duplicates
logger.handlers.clear()
# Choose format
log_format = LOG_FORMAT_DETAILED if format_style == "detailed" else LOG_FORMAT
formatter = logging.Formatter(log_format)
# Add stream handler
if stream:
stream_handler = logging.StreamHandler(sys.stderr)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
# Add file handler if specified
if log_file:
file_handler = logging.FileHandler(log_file)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# Don't propagate to root logger
logger.propagate = False
return logger
def get_logger(name: str) -> logging.Logger:
"""Get a logger for a specific module.
Args:
name: Module name (typically __name__).
Returns:
Logger instance for the module.
"""
# If name starts with the package name, use it directly
if name.startswith(PACKAGE_NAME):
return logging.getLogger(name)
# Otherwise, prefix with package name
return logging.getLogger(f"{PACKAGE_NAME}.{name}")
# Initialize with default settings on import
# This ensures logging works even if setup_logging isn't called explicitly
_default_logger = logging.getLogger(PACKAGE_NAME)
if not _default_logger.handlers:
# Only set up if not already configured
_handler = logging.StreamHandler(sys.stderr)
_handler.setFormatter(logging.Formatter(LOG_FORMAT))
_default_logger.addHandler(_handler)
_default_logger.setLevel(
getattr(logging, os.environ.get("DEEPWIKI_LOG_LEVEL", "WARNING").upper(), logging.WARNING)
)
_default_logger.propagate = False