Nattakarn Phaphoom

11 papers B 1Journal 5Unranked 5
YearRankTypeTitle / Venue / Authors
2021 conf
TALE
Charin Polpanumas, Peerat Limkonchotiwat, Benyapa Matupumanon, Chompakorn Chaksangchaichot, Natkrita Chumlek, Nattakarn Phaphoom, Pakin Siwatammarat, Pined Laohapiengsak, Sukrit Amornpornwiwat, Witchapong Daroontham, Ekapol Chuangsuwanich, Kowin Kulruchakorn, Sarana Nutanong, Titipat Achakulvisut
2020 J jnl
Wirel. Pers. Commun.
Jirapond Muangprathub, Arthit Intarasit, Laor Boongasame, Nattakarn Phaphoom
2018 conf
JCSSE
Nattakarn Phaphoom, Wongduan Saelee, Tunyawat Somjaitaweeporn, Sumeth Yuenyong, Jian Qu
2017 J jnl
CoRR
Nattakarn Phaphoom, Xiaofeng Wang, Sarah Samuel, Sven Helmer, Pekka Abrahamsson
2017 J jnl
CoRR
Pekka Abrahamsson, Sven Helmer, Nattakarn Phaphoom, Lorenzo Nicolodi, Nick Preda, Lorenzo Miori, Matteo Angriman, Juha Rikkilä, Xiaofeng Wang, Karim Hamily, Sara Bugoloni
2015 J jnl
J. Syst. Softw.
Nattakarn Phaphoom, Xiaofeng Wang, Sarah Samuel, Sven Helmer, Pekka Abrahamsson
2013 conf
CloudCom (2)
Pekka Abrahamsson, Sven Helmer, Nattakarn Phaphoom, Lorenzo Nicolodi, Nick Preda, Lorenzo Miori, Matteo Angriman, Juha Rikkilä, Xiaofeng Wang, Karim Hamily, Sara Bugoloni
2013 J jnl
IEEE Trans. Software Eng.
Enrico di Bella, Ilenia Fronza, Nattakarn Phaphoom, Alberto Sillitti, Giancarlo Succi, Jelena Vlasenko
2013 conf
ICSOB
Nattakarn Phaphoom, Xiaofeng Wang, Pekka Abrahamsson
2012 conf
WICSA/ECSA Companion Volume
Nattakarn Phaphoom, Nilay V. Oza, Xiaofeng Wang, Pekka Abrahamsson
2011 B conf
XP
Nattakarn Phaphoom, Alberto Sillitti, Giancarlo Succi
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