114 lines
3.7 KiB
Python
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)
|