Jack Forman

14 papers A* 8Unranked 6
YearRankTypeTitle / Venue / Authors
2026 conf
CHI Extended Abstracts
Hyunyoung Kim, Daniel Ashbrook, Andrea Bianchi, Jack Forman, DPV Joseph Jayakody, Sara Nabil, HyunJoo Oh, Thomas Pietrzak, Thijs Roumen, Valkyrie Savage, Lining Yao, Clement Zheng
2025 A* conf
UIST
Yuqing Lucy Li, Vlasta Kubusová, Wedyan Babatain, Jean-Baptiste Labrune, Sage A Widder, Bernice Sun, Jack Forman, Hiroshi Ishii
2025 conf
UIST Adjunct
Koya Narumi, Yuichi Hirose, Hsuanling Lee, Maria Larsson, Liang He, Mackenzie Leake, Jack Forman, Behnaz Farahi, Lining Yao, Takeo Igarashi
2025 A* conf
CHI
Miana Smith, Jack Forman, Amira Abdel-Rahman, Sophia Wang, Neil Gershenfeld
2023 A* conf
UIST
Jack Forman, Ozgun Kilic Afsar, Sarah Nicita, Rosalie Hsin-Ju Lin, Liu Yang, Megan Hofmann, Akshay Kothakonda, Zachary Gordon, Cedric Honnet, Kristen L. Dorsey, Neil Gershenfeld, Hiroshi Ishii
2023 conf
CHI Extended Abstracts
Jack Forman, Pat Pataranutaporn, Phillip Gough, Raphael Kim, Fiona Bell, Netta Ofer, Jasmine Lu, Angela Vujic, Muqing Bai, Pattie Maes, Hiroshi Ishii, Misha Sra
2022 A* conf
CHI
Ken Nakagaki, Jordan L. Tappa, Yi Zheng, Jack Forman, Joanne Leong, Sven Koenig, Hiroshi Ishii
2021 A* conf
UIST
Jun Gong, Olivia Seow, Cedric Honnet, Jack Forman, Stefanie Mueller
2021 conf
CHI Extended Abstracts
Raphael Kim, Pat Pataranutaporn, Jack Forman, Seung Ah Lee, Ingmar H. Riedel-Kruse, Mirela Alistar, Eldy S. Lazaro Vasquez, Katia Vega, Roland van Dierendonck, Gilad Gome, Oren Zuckerman, Angela Vujic, David Sun Kong, Pattie Maes, Hiroshi Ishii, Misha Sra, Stefan Poslad
2021 A* conf
UIST
Ozgun Kilic Afsar, Ali Shtarbanov, Hila Mor, Ken Nakagaki, Jack Forman, Karen Modrei, Seung Hee Jeong, Klas Hjort, Kristina Höök, Hiroshi Ishii
2021 conf
CHI Extended Abstracts
Phillip Gough, Jack Forman, Pat Pataranutaporn, Leigh-Anne Hepburn, Carolina Ramirez Figueroa, Clare M. Cooper, Angela Vujic, David Sun Kong, Raphael Kim, Pattie Maes, Hiroshi Ishii, Misha Sra, Naseem Ahmadpour
2020 A* conf
UIST
Jack Forman, Mustafa Doga Dogan, Hamilton Forsythe, Hiroshi Ishii
2020 conf
CHI Extended Abstracts
Michael L. Rivera, Jack Forman, Scott E. Hudson, Lining Yao
2019 A* conf
CHI
Jack Forman, Taylor Tabb, Youngwook Do, Meng-Han Yeh, Adrian Galvin, Lining Yao
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