Files
ETPlot/orchestration/logger.py
T
2025-08-01 13:50:20 +02:00

114 lines
3.7 KiB
Python

"""
Gallery logging wrapper using Python's built-in logging module.
"""
import logging
import sys
class GalleryLogger:
"""
Simple wrapper around Python's logging module for gallery generation.
Provides convenient methods for common logging patterns in the gallery app.
"""
def __init__(self, name: str = "gallery", level: int = logging.INFO, verbose: bool = False):
"""
Initialize the gallery logger.
Args:
name: Logger name
level: Logging level (default: INFO)
verbose: If True, enables DEBUG level logging
"""
self.logger = logging.getLogger(name)
# Set level based on verbose flag
if verbose:
self.logger.setLevel(logging.DEBUG)
else:
self.logger.setLevel(level)
# Only add handler if logger doesn't have one already
if not self.logger.handlers:
handler = logging.StreamHandler(sys.stdout)
formatter = logging.Formatter(
'%(levelname)s: %(message)s'
)
handler.setFormatter(formatter)
self.logger.addHandler(handler)
def info(self, message: str):
"""Log an info message."""
self.logger.info(message)
def debug(self, message: str):
"""Log a debug message."""
self.logger.debug(message)
def warning(self, message: str):
"""Log a warning message."""
self.logger.warning(message)
def error(self, message: str):
"""Log an error message."""
self.logger.error(message)
def success(self, message: str):
"""Log a success message (as info with special prefix)."""
self.logger.info(f"{message}")
# Convenience methods for common gallery operations
def found_directory(self, dir_name: str, pdf_count: int):
"""Log discovery of a directory with PDFs."""
if pdf_count > 0:
self.info(f"Found {pdf_count} PDF files in {dir_name}/")
def found_pdf(self, pdf_name: str):
"""Log discovery of a PDF file."""
self.debug(f"Found PDF: {pdf_name}")
def found_metadata(self, metadata_file: str, field_count: int):
"""Log discovery of a metadata file."""
self.info(f"Found metadata: {metadata_file} ({field_count} fields)")
def converted_pdf(self, pdf_name: str, duration: float = None):
"""Log successful PDF conversion."""
if duration is not None:
self.info(f"Converting {pdf_name}{pdf_name.replace('.pdf', '.png')} ({duration:.2f}s)")
else:
self.info(f"Converting {pdf_name}{pdf_name.replace('.pdf', '.png')}")
def skipped_pdf(self, pdf_name: str, reason: str = "up-to-date"):
"""Log skipped PDF conversion."""
self.debug(f"Skipping {pdf_name} ({reason})")
def generated_html(self, html_path: str, plot_count: int):
"""Log HTML page generation."""
self.info(f"Generated {html_path} ({plot_count} plots)")
def assets_updated(self):
"""Log assets update."""
self.info("Assets copied to target directory")
def create_logger(verbose: bool = False, quiet: bool = False) -> GalleryLogger:
"""
Create a configured logger for the gallery application.
Args:
verbose: Enable debug-level logging
quiet: Suppress most output (only errors and warnings)
Returns:
Configured GalleryLogger instance
"""
if quiet:
level = logging.WARNING
elif verbose:
level = logging.DEBUG
else:
level = logging.INFO
return GalleryLogger(level=level, verbose=verbose)