Xianen Zhou

16 papers Journal 11Unranked 5
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Instrum. Meas.
Qiu Fang, Changqing Gao, Tianjian Jiang, Xianen Zhou, Yaonan Wang
2024 conf
ICIT
Yunlong Ma, Yaonan Wang, Yiming Jiang, Xianen Zhou, Ge Zhu, Qing Zhu
2024 conf
ICRCA
Xin Huang, Yuqiang Wang, Yuezhong Li, Xianen Zhou
2023 J jnl
IEEE Trans. Instrum. Meas.
Jiaming Zhou, Qing Zhu, Yaonan Wang, Xianen Zhou, Mingtao Feng, Xuebing Liu, Yang Mo
2022 conf
ASCC
Kexin Qi, Qing Zhu, Xianen Zhou, Yaonan Wang, Jia Feng
2022 J jnl
IEEE Trans. Ind. Electron.
Haotian Wu, Yaonan Wang, Patricio A. Vela, Hui Zhang, Xiaofang Yuan, Xianen Zhou
2022 conf
ASCC
Yanqing Yang, Jianxu Mao, Yaonan Wang, Hui Zhang, Xianen Zhou, Yurong Chen
2022 J jnl
Sensors
Zhi Li, Jianqiang Hu, Zhangxiang Zhou, Jin Wang, Xianen Zhou, Qing Zhu, Shaonan Chen, Yaonan Wang
2021 J jnl
IET Image Process.
Kai Zeng, Yaonan Wang, Jianxu Mao, Xianen Zhou
2021 J jnl
IEEE Trans. Medical Imaging
Yurong Chen, Hui Zhang, Yaonan Wang, Yimin Yang, Xianen Zhou, Q. M. Jonathan Wu
2021 J jnl
IEEE Trans. Instrum. Meas.
Haotian Wu, Yaonan Wang, Hui Zhang, Xiaofang Yuan, Xianen Zhou
2020 J jnl
IEEE Trans. Ind. Informatics
Xianen Zhou, Yaonan Wang, Qing Zhu, Jianxu Mao, Changyan Xiao, Xiao Lu, Hui Zhang
2020 J jnl
IEEE Trans. Instrum. Meas.
Hui Zhang, Miao Zhao, Li Liu, Hang Zhong, Zhicong Liang, Yimin Yang, Xianen Zhou, Q. M. Jonathan Wu, Yaonan Wang
2019 J jnl
IEEE Trans. Instrum. Meas.
Xianen Zhou, Yaonan Wang, Changyan Xiao, Qing Zhu, Xiao Lu, Hui Zhang, Ji Ge, Huihuang Zhao
2019 J jnl
Vis. Comput.
Xianen Zhou, Yaonan Wang, Qing Zhu, Changyan Xiao, Xiao Lu
2016 conf
CCPR (1)
Xianen Zhou, Yaonan Wang, Qing Zhu, Zhiqiang Miao
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