Ofer Levi

12 papers C 2Journal 6Unranked 4
YearRankTypeTitle / Venue / Authors
2021 conf
SAI (2)
Ben Zagagy, Maya Herman, Ofer Levi
2021 conf
IntelliSys (2)
Chen Avni, Maya Herman, Ofer Levi
2020 conf
SPECOM
Dima Shulga, Vered Silber-Varod, Diamanta Benson-Karai, Ofer Levi, Elad Vashdi, Anat Lerner
2019 J jnl
Math. Soc. Sci.
Chen Cohen, Ofer Levi, Aner Sela
2017 J jnl
Eur. J. Oper. Res.
Shaul P. Ladany, Ofer Levi
2016 J jnl
J. Electronic Imaging
Eran Small, Ziv Mhabary, Ofer Levi, Adrian Stern
2016 J jnl
Medical Biol. Eng. Comput.
Shai Tejman-Yarden, Ofer Levi, Alex Beizerov, Yisrael Parmet, Tu Viet Nguyen, Michael A. Saunders, Zvia Rudich, James C. Perry, Dewleen G. Baker, Tobias Möller-Bertram
2012 C conf
EANN
Polina Kurtser, Ofer Levi, Vladimir Gontar
2010 J jnl
J. Approx. Theory
Ery Arias-Castro, Boris Efros, Ofer Levi
2006 conf
EMBC
Thomas T. Lee, Ofer Levi, Jianhua Cang, Megumi Kaneko, Michael P. Stryker, Stephen J. Smith, Krishna V. Shenoy, James S. Harris
2004 J jnl
Eur. J. Oper. Res.
Israel David, Ofer Levi
2004 C conf
SPIRE
Gad M. Landau, Ofer Levi, Steven Skiena
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