Préfixer les logs par le nom du fichier LAZ en cours
Ajout d'un FilePrefixFilter qui préfixe chaque message avec [basename] quand un fichier est en cours de traitement. Les workers paralleles affichent ainsi clairement quel fichier produit chaque log. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@ -125,6 +125,10 @@ Exemples:
|
||||
# Configure logging before any other output
|
||||
setup_logging(verbose=args.verbose, debug=args.debug)
|
||||
|
||||
# Add file prefix filter for parallel processing
|
||||
from .pipeline import _file_filter
|
||||
logger.addFilter(_file_filter)
|
||||
|
||||
logger.info("=" * 60)
|
||||
logger.info("Pipeline LiDAR Archéologique")
|
||||
logger.info("=" * 60)
|
||||
|
||||
@ -21,6 +21,24 @@ try:
|
||||
except RuntimeError:
|
||||
pass # Already set (e.g. in tests or when called multiple times)
|
||||
|
||||
logger = logging.getLogger("lidar")
|
||||
|
||||
|
||||
class FilePrefixFilter(logging.Filter):
|
||||
"""Adds a file prefix to log messages when processing a specific file."""
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.basename = None
|
||||
|
||||
def filter(self, record):
|
||||
if self.basename:
|
||||
record.msg = f"[{self.basename}] {record.msg}"
|
||||
return True
|
||||
|
||||
|
||||
# Module-level filter instance so process_file can set it
|
||||
_file_filter = FilePrefixFilter()
|
||||
|
||||
from .dtm import classify_ground, create_dtm_fast
|
||||
from .visualizations import (
|
||||
generate_hillshade, generate_slope, generate_aspect, generate_curvature,
|
||||
@ -33,8 +51,6 @@ from .gpu import gpu_cleanup
|
||||
from .ign import generate_ign_overlay
|
||||
from .rendering import tif_to_png, generate_pdf_report
|
||||
|
||||
logger = logging.getLogger("lidar")
|
||||
|
||||
|
||||
# Ordered list of visualization steps.
|
||||
# Each entry: (name, function_or_lambda)
|
||||
@ -190,6 +206,7 @@ class LidarArchaeoPipeline:
|
||||
def process_file(self, laz_file):
|
||||
"""Process a single LAZ file through the full pipeline."""
|
||||
basename = laz_file.stem
|
||||
_file_filter.basename = basename
|
||||
t_start = time.time()
|
||||
|
||||
logger.info("=" * 60)
|
||||
@ -231,6 +248,7 @@ class LidarArchaeoPipeline:
|
||||
t_total = time.time() - t_start
|
||||
logger.info(f"✓ {basename} terminé en {t_total:.1f}s")
|
||||
logger.debug(f" Détails: classification={t_classif:.1f}s, DTM={t_dtm:.1f}s, PDF={t_pdf:.1f}s")
|
||||
_file_filter.basename = None
|
||||
return True
|
||||
|
||||
def process_all(self):
|
||||
@ -324,12 +342,13 @@ def _process_file_standalone(laz_file_str, input_dir, output_dir, resolution, fo
|
||||
# Configure logging in worker process (spawn doesn't inherit parent config)
|
||||
import logging
|
||||
import sys
|
||||
logger = logging.getLogger("lidar")
|
||||
if not logger.handlers:
|
||||
worker_logger = logging.getLogger("lidar")
|
||||
if not worker_logger.handlers:
|
||||
handler = logging.StreamHandler(sys.stdout)
|
||||
handler.setFormatter(logging.Formatter("%(message)s"))
|
||||
logger.setLevel(logging.INFO)
|
||||
logger.addHandler(handler)
|
||||
worker_logger.setLevel(logging.INFO)
|
||||
worker_logger.addHandler(handler)
|
||||
worker_logger.addFilter(_file_filter)
|
||||
|
||||
pipeline = LidarArchaeoPipeline(input_dir, output_dir, resolution=resolution, workers=1, force=force)
|
||||
basename = Path(laz_file_str).stem
|
||||
|
||||
Reference in New Issue
Block a user