Hae-Wook Choi

18 papers B 1C 5Journal 5Unranked 7
YearRankTypeTitle / Venue / Authors
2014 conf
OFC
Hae Young Rha, Byoung Gu Jeon, Hae-Wook Choi
2014 conf
VTC Spring
Thu Phuong Nguyen, Minh-Tuan Le, Vu-Duc Ngo, Xuan-Nam Tran, Hae-Wook Choi
2010 J jnl
IEICE Trans. Commun.
Hun-sik Kang, Min-Lee Hwang, Jin Lee, Sok-Kyu Lee, Hae-Wook Choi, Sin-Chong Park
2007 C conf
ISPA
Huy Nam Nguyen, Vu-Duc Ngo, Younghwan Bae, Hanjin Cho, Hae-Wook Choi
2007 C conf
ISPA
Vu-Duc Ngo, June-Young Chang, Younghwan Bae, Hanjin Cho, Hae-Wook Choi
2007 C conf
ISPA
Seongmin Noh, Daehyun Kim, Vu-Duc Ngo, Hae-Wook Choi
2006 J jnl
IEICE Trans. Inf. Syst.
Jungbo Son, Hae-Wook Choi, Sin-Chong Park
2006 J jnl
IEICE Trans. Electron.
Ho-Seok Choi, Hae-Wook Choi, Sin-Chong Park
2006 J jnl
IEICE Trans. Commun.
Sang-Ho Seo, Hae-Wook Choi, Sin-Chong Park
2006 C conf
ISPA
Vu-Duc Ngo, Huy Nam Nguyen, Hae-Wook Choi
2006 conf
ISPA Workshops
Vu-Duc Ngo, Huy Nam Nguyen, Younghwan Bae, Hanjin Cho, Hae-Wook Choi
2005 C conf
EUC
Vu-Duc Ngo, Huy Nam Nguyen, Hae-Wook Choi
2005 conf
ICESS
Vu-Duc Ngo, Huy Nam Nguyen, Hae-Wook Choi
2005 conf
ICESS
Huy Nam Nguyen, Vu-Duc Ngo, Hae-Wook Choi
2005 conf
Circuits, Signals, and Systems
Huy Nam Nguyen, Vu-Duc Ngo, Hae-Wook Choi
2004 conf
ICT
Vu-Duc Ngo, Hae-Wook Choi, Sin-Chong Park
2004 B conf
PIMRC
Vu-Duc Ngo, Hae-Wook Choi, Sin-Chong Park
1995 J jnl
IEEE J. Solid State Circuits
Won-Chul Song, Hae-Wook Choi, Sung-Ung Kwak, Bang-Sup Song
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