Xavier Skapin

17 papers Journal 3Unranked 13
YearRankTypeTitle / Venue / Authors
2018 conf
VISIGRAPP (1: GRAPP)
Philippe Meseure, Xavier Skapin, Emmanuelle Darles, Guilhem Delaitre
2014 conf
Smart Graphics
Annie Luciani, Nicolas Castagné, Philippe Meseure, Xavier Skapin, Saman Kalantari, Emmanuelle Darles
2014 J jnl
Comput. Graph.
Richard Bezin, Benoît Crespin, Xavier Skapin, Olivier Terraz, Philippe Meseure
2014 conf
GRAPP
Annie Luciani, Ali Allaoui, Nicolas Castagné, Emmanuelle Darles, Xavier Skapin, Philippe Meseure
2014 conf
Eurographics (Education Papers)
Richard Bezin, Benoît Crespin, Xavier Skapin, Philippe Meseure, Olivier Terraz
2012 conf
VRIPHYS
Thomas Jund, Ali Allaoui, Emmanuelle Darles, Xavier Skapin, Philippe Meseure, Annie Luciani
2011 conf
VRIPHYS
Richard Bezin, Benoît Crespin, Xavier Skapin, Olivier Terraz, Philippe Meseure
2010 conf
ICCVG (1)
Richard Bezin, Alexandre Peyrat, Benoît Crespin, Olivier Terraz, Xavier Skapin, Philippe Meseure
2010 conf
VRIPHYS
Philippe Meseure, Emmanuelle Darles, Xavier Skapin
2009 conf
Shape Modeling International
Mehdi Baba-ali, David Marcheix, Xavier Skapin
2008 conf
VRIPHYS
Pierre-François Léon, Xavier Skapin, Philippe Meseure
2008 conf
DGCI
Mehdi Baba-ali, Guillaume Damiand, Xavier Skapin, David Marcheix
2007 conf
Afrigraph
Mehdi Baba-ali, David Marcheix, Xavier Skapin, Yves Bertrand
2004 J jnl
Int. J. Comput. Geom. Appl.
Pascal Lienhardt, Xavier Skapin, Antoine Bergey
2001 J jnl
Comput. Animat. Virtual Worlds
Xavier Skapin, Pascal Lienhardt
2001
Xavier Skapin
2000 conf
Computer Animation and Simulation
Xavier Skapin, Pascal Lienhardt
redb/logging_utils.py
← Index redb/logging_utils.py python
"""
Logging utilities and shared enums for REDB.

Contains the ImportResult enum, log formatters, and logger setup functions
used across the ingestor pipeline.
"""
import logging
from logging.handlers import QueueHandler
import os
from enum import Enum


class ImportResult(Enum):
    CORRECTLY = 0
    PARTIALLY = 1
    FAILED = 2
    PENDING = 3
    SKIPPED = 4


class FileNameFormatter(logging.Formatter):
    def format(self, record):
        record.filenameinfo = getattr(record, "filenameinfo", "unknown")
        return super().format(record)


def setup_logger(log_queue, filename):
    logger = logging.getLogger(filename)
    if not logger.handlers:
        if os.getenv("SERVER_ENV") == "prod":
            logger.setLevel(logging.INFO)
        else:
            logger.setLevel(logging.DEBUG)
        handler = QueueHandler(log_queue)
        logger.addHandler(handler)
        logger.propagate = False  # Prevent propagation to parent loggers
    return logger


def logger_thread(log_queue, log_file):
    handler = logging.FileHandler(log_file)
    formatter = FileNameFormatter(
        "%(asctime)s - %(filenameinfo)s - %(levelname)s - %(message)s"
    )
    handler.setFormatter(formatter)

    while True:
        try:
            record = log_queue.get()
            if record is None:
                break
            # Format and write the log record
            message = formatter.format(record)
            handler.stream.write(message + "\n")
            handler.stream.flush()
        except Exception:
            import traceback
            import sys

            print("[ERR] Error in logger thread:", file=sys.stderr)
            traceback.print_exc(file=sys.stderr)


def setup_direct_logger(log_file, filename, pid=None):
    """Setup a logger that writes directly to the log file without using a queue."""
    # Create a unique logger name using the process ID
    logger_name = f"{filename}_{pid}" if pid else filename
    logger = logging.getLogger(logger_name)

    if not logger.handlers:
        handler = logging.FileHandler(log_file)
        formatter = logging.Formatter("%(asctime)s - %(filenameinfo)s - %(levelname)s - %(message)s")
        handler.setFormatter(formatter)
        logger.addHandler(handler)

        if os.getenv("SERVER_ENV") == "prod":
            logger.setLevel(logging.INFO)
        else:
            logger.setLevel(logging.DEBUG)

    # Add filename info to the logger's extra info
    extra = {"filenameinfo": filename}
    logger = logging.LoggerAdapter(logger, extra)

    return logger