Majda Fouka

16 papers A* 1B 2C 1Journal 4Unranked 8
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Intell. Veh.
Chouki Sentouh, Majda Fouka, Jagat Jyoti Rath, Jean-Christophe Popieul
2023 J jnl
Sensors
Chouki Sentouh, Majda Fouka, Jean-Christophe Popieul
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Majda Fouka, Lamri Nehaoua, Hichem Arioui
2021 A* conf
ICRA
Lamri Nehaoua, Majda Fouka, Hichem Arioui
2020 conf
CDC
Majda Fouka, Lamri Nehaoua, Hichem Arioui
2019 J jnl
IEEE Control. Syst. Lett.
Majda Fouka, Lamri Nehaoua, Hichem Arioui, Saïd Mammar
2019 conf
ICNSC
Majda Fouka, Lamri Nehaoua, Hichem Arioui, Saïd Mammar
2019 conf
ITSC
Majda Fouka, Lamri Nehaoua, Hichem Arioui, Saïd Mammar
2019 conf
ITSC
Pierre-Marie Damon, Majda Fouka, Hicham Hadj-Abdelkader, Hichem Arioui
2018 conf
CDC
Majda Fouka, Lamri Nehaoua, Mohammed El-Habib Dabladji, Hichem Arioui, Saïd Mammar
2018 B conf
Intelligent Vehicles Symposium
Majda Fouka, Lamri Nehaoua, Hichem Arioui, Saïd Mammar
2018 conf
ITSC
Majda Fouka, Lamri Nehaoua, Dalil Ichalal, Hichem Arioui, Saïd Mammar
2018 conf
ITSC
Simone Gelmini, Majda Fouka, Silvia Carla Strada, Mara Tanelli, Sergio M. Savaresi, Claudio De Tommasi
2018 C conf
ACC
Majda Fouka, Lamri Nehaoua, Hichem Arioui, Saïd Mammar
2017 B conf
SMC
Majda Fouka, Lamri Nehaoua, Hichem Arioui, Saïd Mammar
2017 conf
MED
Majda Fouka, Pierre-Marie Damon, Lamri Nehaoua, Hichem Arioui, Saïd Mammar
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