Chang-Wook Han

21 papers B 1C 4Misc 2Journal 7Unranked 6
YearRankTypeTitle / Venue / Authors
2015 J jnl
J. Multim. Inf. Syst.
Chang-Wook Han, Yeunghak Lee
2012 J jnl
IEICE Trans. Electron.
Sang-Gun Lee, Hong-Seok Choi, Chang-Wook Han, Seok-Jong Lee, Yoon-Heung Tak, Byung-Chul Ahn
2008 ch.
Digital Human Modeling
Yeung-hak Lee, Chang-Wook Han, Tae-Sun Kim
2008 B conf
FUZZ-IEEE
Yeung-hak Lee, Chang-Wook Han, B. K. Kim
2008 C conf
IDEAL
Chang-Wook Han
2008 C conf
IDEAL
Chang-Wook Han
2007 conf
ICANNGA (1)
Soowhan Han, Imgeun Lee, Chang-Wook Han
2007 J jnl
J. Adv. Comput. Intell. Intell. Informatics
Chang-Wook Han, Hajime Nobuhara
2006 Misc conf
CSR
Yeung-hak Lee, Chang-Wook Han
2006 conf
SETN
Chang-Wook Han, Jung-Il Park
2006 conf
KES (1)
Chang-Wook Han, Jung-Il Park
2006 conf
SETN
Chang-Wook Han, Jung-Il Park
2006 C conf
IEA/AIE
Chang-Wook Han, Jung-Il Park
2006 conf
ISNN (1)
Chang-Wook Han, Jung-Il Park
2006 Misc conf
International Conference on Computational Science (4)
Yeung-hak Lee, Chang-Wook Han, Tae-Sun Kim
2005 J jnl
Math. Comput. Model.
Soowhan Han, Witold Pedrycz, Chang-Wook Han
2004 J jnl
Int. J. Fuzzy Log. Intell. Syst.
Soowhan Han, Imgeun Lee, Chang-Wook Han
2004 J jnl
Int. J. Syst. Sci.
Chang-Wook Han, Jung-Il Park
2004 J jnl
Fuzzy Optim. Decis. Mak.
Witold Pedrycz, Marek Z. Reformat, Chang-Wook Han
2001 C conf
ACC
Chang-Wook Han, Jung-Il Park
2000 conf
CDC
Chang-Wook Han, Jung-Il Park
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