#!/usr/bin/env python3
"""Logging module for arrakis"""
from __future__ import annotations
import argparse
import io
import logging
# https://stackoverflow.com/questions/61324536/python-argparse-with-argumentdefaultshelpformatter-and-rawtexthelpformatter
[docs]
class TqdmToLogger(io.StringIO):
"""
Output stream for TQDM which will output to logger module instead of
the StdOut.
"""
def __init__(self, logger: logging.Logger | None, level: int | None = None) -> None:
super().__init__()
self.logger = logger
self.level = level or logging.INFO
[docs]
def write(self, buf: str) -> int:
self.buf = buf.strip("\r\n\t ")
return len(buf)
[docs]
def flush(self) -> None:
if self.logger is not None and isinstance(self.level, int):
self.logger.log(self.level, self.buf)
# Create formatter
# formatter = logging.Formatter(
# "SPICE: %(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s"
# )
[docs]
def get_arrakis_logger(
name: str = "arrakis", attach_handler: bool = True
) -> logging.Logger:
"""Will construct a logger object.
Args:
name (str, optional): Name of the logger to attempt to use. This is ignored if in a prefect flowrun. Defaults to 'arrakis'.
attach_handler (bool, optional): Attacjes a custom StreamHandler. Defaults to True.
Returns:
logging.Logger: The appropriate logger
"""
logging.captureWarnings(True)
logger = logging.getLogger(name)
logger.setLevel(logging.WARNING)
if attach_handler:
# Create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# Add formatter to ch
ch.setFormatter(CustomFormatter())
logger.addHandler(ch)
return logger
[docs]
logger = get_arrakis_logger()