Indranil Roychoudhury

15 papers C 1Misc 1Journal 7Unranked 5
YearRankTypeTitle / Venue / Authors
2024 Misc conf
QCE
Priya Mishra, Rodney Lessard, Indranil Roychoudhury
2018 J jnl
Neurocomputing
Marco Rigamonti, Piero Baraldi, Enrico Zio, Indranil Roychoudhury, Kai Goebel, Scott Poll
2015 C conf
DX
Matthew J. Daigle, Aníbal Bregón, Indranil Roychoudhury
2015 J jnl
J. Aerosp. Inf. Syst.
Edward Balaban, Abhinav Saxena, Sriram Narasimhan, Indranil Roychoudhury, Michael Koopmans, Carl Ott, Kai Goebel
2014 J jnl
Artif. Intell.
Aníbal Bregón, Matthew J. Daigle, Indranil Roychoudhury, Gautam Biswas, Xenofon D. Koutsoukos, Belarmino Pulido
2014 J jnl
IEEE Trans. Reliab.
Matthew J. Daigle, Aníbal Bregón, Indranil Roychoudhury
2012 conf
Infotech@Aerospace
Abhinav Saxena, Indranil Roychoudhury, Christian Neukom, Greg Pisanich, Alex Huang, Duc Tran
2012 conf
Infotech@Aerospace
Abhinav Saxena, Indranil Roychoudhury, Jose Celaya, Bhaskar Saha, Sankalita Saha, Kai Goebel
2011 J jnl
Simul.
Indranil Roychoudhury, Matthew J. Daigle, Gautam Biswas, Xenofon D. Koutsoukos
2010 J jnl
IEEE Trans. Syst. Man Cybern. Part A
Matthew J. Daigle, Indranil Roychoudhury, Gautam Biswas, Xenofon D. Koutsoukos, Ann Patterson-Hine, Scott Poll
2010 conf
SpringSim
Indranil Roychoudhury, Gautam Biswas, Xenofon D. Koutsoukos
2009 J jnl
IEEE Trans Autom. Sci. Eng.
Indranil Roychoudhury, Gautam Biswas, Xenofon D. Koutsoukos
2009
Indranil Roychoudhury
2009 conf
CDC
Indranil Roychoudhury, Gautam Biswas, Xenofon D. Koutsoukos
2007 conf
HSCC
Matthew J. Daigle, Indranil Roychoudhury, Gautam Biswas, Xenofon D. Koutsoukos
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