Kasper Welbers

11 papers A 1B 1Journal 7Unranked 2
YearRankTypeTitle / Venue / Authors
2024 J jnl
Internet Policy Rev.
Valerie Hase, Jef Ausloos, Laura Boeschoten, Nico Pfiffner, Heleen Janssen, Theo B. Araujo, Thijs Carrière, Claes de Vreese, Jörg Haßler, Felicia Loecherbach, Zoltán Kmetty, Judith Möller, Jakob Ohme, Elisabeth Schmidbauer, Bella Struminskaya, Damian Trilling, Kasper Welbers, Mario Haim
2023 A conf
ICWSM
Zilin Lin, Kasper Welbers, Susan Vermeer, Damian Trilling
2023 J jnl
CoRR
Moritz Laurer, Wouter van Atteveldt, Andreu Casas, Kasper Welbers
2023 conf
NORMalize@RecSys
Rupert Kiddle, Kasper Welbers, Anne C. Kroon, Damian Trilling
2022 J jnl
CoRR
Zilin Lin, Kasper Welbers, Susan Vermeer, Damian Trilling
2021 conf
WebSci
Felicia Loecherbach, Kasper Welbers, Judith Möller, Damian Trilling, Wouter van Atteveldt
2021 B conf
K-CAP
Michel Wijkstra, Timo Lek, Tobias Kuhn, Kasper Welbers, Mickey Steijaert
2021 J jnl
CoRR
Michel Wijkstra, Timo Lek, Tobias Kuhn, Kasper Welbers, Mickey Steijaert
2018 J jnl
New Media Soc.
Kasper Welbers, Michaël Opgenhaffen
2011 J jnl
J. Informetrics
Loet Leydesdorff, Kasper Welbers
2010 J jnl
CoRR
Loet Leydesdorff, Kasper Welbers
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