Chang-Hwan Kim

18 papers A* 6Journal 11Unranked 1
YearRankTypeTitle / Venue / Authors
2022 A* conf
ICRA
Jeeho Ahn, Chang-Hwan Kim, Changjoo Nam
2022 J jnl
Robotics Auton. Syst.
Yu-Jung Chae, Changjoo Nam, Daseul Yang, HunSeob Sin, Chang-Hwan Kim, Sung-Kee Park
2022 J jnl
Intell. Serv. Robotics
Jinhwi Lee, Ulzhalgas Rakhman, Changjoo Nam, Seunghyun Kang, Jonghyeon Park, Chang-Hwan Kim
2022 J jnl
IEEE Access
Jinhwi Lee, Changjoo Nam, Jong Hyeon Park, Chang-Hwan Kim
2021 A* conf
ICRA
Jeeho Ahn, Jaeho Lee, SangHun Cheong, Chang-Hwan Kim, Changjoo Nam
2021 J jnl
CoRR
Jeeho Ahn, Chang-Hwan Kim, Changjoo Nam
2021 J jnl
IEEE Trans. Robotics
Changjoo Nam, SangHun Cheong, Jinhwi Lee, Dong Hwan Kim, Chang-Hwan Kim
2021 J jnl
Intell. Serv. Robotics
SangHun Cheong, Brian Y. Cho, Jinhwi Lee, Jeongho Lee, Dong Hwan Kim, Changjoo Nam, Chang-Hwan Kim, Sung-Kee Park
2021 A* conf
ICRA
Jinhwi Lee, Changjoo Nam, Jonghyeon Park, Chang-Hwan Kim
2020 J jnl
IEEE Access
Changjoo Nam, Seokjun Lee, Jeongho Lee, SangHun Cheong, Dong Hwan Kim, Chang-Hwan Kim, Incheol Kim, Sung-Kee Park
2020 A* conf
ICRA
Changjoo Nam, Jinhwi Lee, SangHun Cheong, Brian Y. Cho, Chang-Hwan Kim
2020 J jnl
CoRR
Changjoo Nam, Jinhwi Lee, SangHun Cheong, Brian Y. Cho, Chang-Hwan Kim
2020 A* conf
ICRA
SangHun Cheong, Brian Y. Cho, Jinhwi Lee, Chang-Hwan Kim, Changjoo Nam
2020 J jnl
CoRR
SangHun Cheong, Brian Y. Cho, Jinhwi Lee, Chang-Hwan Kim, Changjoo Nam
2019 A* conf
ICRA
Jinhwi Lee, Younggil Cho, Changjoo Nam, Jonghyeon Park, Chang-Hwan Kim
2019 J jnl
CoRR
Jinhwi Lee, Younggil Cho, Changjoo Nam, Jonghyeon Park, Chang-Hwan Kim
2019 J jnl
CoRR
Changjoo Nam, Jinhwi Lee, Younggil Cho, Jeongho Lee, Dong Hwan Kim, Chang-Hwan Kim
2019 conf
UR
Kibeom Kim, Jinhwi Lee, Chang-Hwan Kim, Changjoo Nam
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