James Grant

19 papers B 1C 1Journal 12Unranked 5
YearRankTypeTitle / Venue / Authors
2024 B conf
ARES
Matthew Reaney, Kieran McLaughlin, James Grant
2024 conf
AMAI@MICCAI
Zelong Liu, Peyton Smith, Alexander Lautin, Jieshen Zhou, Maxwell Yoo, Mikey Sullivan, Haorun Li, Louisa Deyer, Alexander Zhou, Arnold Yang, Alara Yilmaz, Catherine Zhang, James Grant, Daiqing Li, Zahi A. Fayad, Sean Huver, Timothy Deyer, Xueyan Mei
2023 J jnl
CoRR
Zelong Liu, Alexander Zhou, Arnold Yang, Alara Yilmaz, Maxwell Yoo, Mikey Sullivan, Catherine Zhang, James Grant, Daiqing Li, Zahi A. Fayad, Sean Huver, Timothy Deyer, Xueyan Mei
2023 C conf
INDIN
Henry Hui, James Grant, Kieran McLaughlin, David M. Laverty, Sakir Sezer
2022 J jnl
BMC Medical Informatics Decis. Mak.
Kishore Kumar Jagadeesan, James Grant, Sue Griffin, Ruth Barden, Barbara Kasprzyk-Hordern
2021 J jnl
J. Comput. Phys.
William Robert Saunders, James Grant, Eike Hermann Müller
2020 J jnl
Data Sci. J.
James Harold Davenport, James Grant, Catherine Mary Jones
2020 J jnl
J. Comput. Phys.
William Robert Saunders, James Grant, Eike Hermann Müller, Ian Thompson
2020 J jnl
CoRR
William Robert Saunders, James Grant, Eike Hermann Müller
2020 J jnl
CoRR
William Robert Saunders, James Grant, Eike Hermann Müller
2019 J jnl
CoRR
William Robert Saunders, James Grant, Eike Hermann Müller, Ian Thompson
2018 J jnl
Comput. Phys. Commun.
William R. Saunders, James Grant, Eike Hermann Müller
2017 J jnl
CoRR
William R. Saunders, James Grant, Eike Hermann Müller
2017 conf
PARCO
William Robert Saunders, James Grant, Eike Hermann Müller
2017 J jnl
CoRR
William R. Saunders, James Grant, Eike Hermann Müller
2009 conf
SIGGRAPH Art Gallery
James Grant, Todd Spencer, Richard Armijo
2007 conf
ADHOC-NOW
Rudi Ball, James Grant, Jonathan So, Victoria Spurrett, Rogério de Lemos
2007 conf
I3E (1)
James Grant, Kathy Lynch, Julie Fisher
2005 J jnl
Comput. Law Secur. Rev.
James Grant
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