Rafael Najmanovich

17 papers C 1Journal 15Unranked 1
YearRankTypeTitle / Venue / Authors
2024 J jnl
J. Chem. Inf. Model.
Gabriel T. Galdino, Olivier Mailhot, Rafael Najmanovich
2023 J jnl
Bioinform.
Natália Teruel, Vinicius Magalhães Borges, Rafael Najmanovich
2023 J jnl
Bioinform.
Olivier Mailhot, François Major, Rafael Najmanovich
2022 J jnl
Bioinform.
Matthew Crown, Natália Teruel, Rafael Najmanovich, Matthew Bashton
2021 J jnl
Bioinform.
Olivier Mailhot, Rafael Najmanovich
2016 J jnl
Bioinform.
Matthieu Chartier, Etienne Adriansen, Rafael Najmanovich
2016 conf
SpringSim (TMS-DEVS)
Laouen Belloli, Gabriel A. Wainer, Rafael Najmanovich
2015 J jnl
J. Chem. Inf. Model.
Matthieu Chartier, Rafael Najmanovich
2014 J jnl
BMC Syst. Biol.
Mathieu Larocque, Thierry Chénard, Rafael Najmanovich
2012 J jnl
Bioinform.
Matthieu Chartier, Francis Gaudreault, Rafael Najmanovich
2012 J jnl
Bioinform.
Francis Gaudreault, Matthieu Chartier, Rafael Najmanovich
2011 J jnl
J. Chem. Inf. Model.
Valérie Campagna-Slater, Man Wai Mok, Kong T. Nguyen, Miklos Feher, Rafael Najmanovich, Matthieu Schapira
2008 C conf
ECCB
Rafael Najmanovich, Natalja Kurbatova, Janet M. Thornton
2007 J jnl
Bioinform.
Rafael Najmanovich, Abdellah Allali-Hassani, Richard J. Morris, Ludmila Dombrovsky, Patricia W. Pan, Masoud Vedadi, Alexander N. Plotnikov, Aled M. Edwards, Cheryl H. Arrowsmith, Janet M. Thornton
2005 J jnl
Bioinform.
Richard J. Morris, Rafael Najmanovich, Abdullah Kahraman, Janet M. Thornton
2004 J jnl
J. Comput. Chem.
Eran Eyal, Rafael Najmanovich, Brendan J. McConkey, Marvin Edelman, Vladimir Sobolev
2001 J jnl
Bioinform.
Eran Eyal, Rafael Najmanovich, Vladimir Sobolev, Marvin Edelman
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