Spaces:
Paused
Paused
import logging | |
import sys | |
from pathlib import Path | |
class StreamToLogger: | |
""" | |
Fake file-like stream object that redirects writes to a logger instance. | |
""" | |
def __init__(self, logger, log_level=logging.INFO): | |
self.logger = logger | |
self.log_level = log_level | |
self.linebuf = '' | |
self.enabled = True | |
def write(self, buf): | |
if self.enabled: | |
for line in buf.rstrip().splitlines(): | |
self.logger.log(self.log_level, line.rstrip()) | |
def flush(self): | |
pass | |
def enable(self): | |
self.enabled = True | |
def isatty(self): | |
return False | |
def disable(self): | |
self.enabled = False | |
def setup_logger(config: dict, name: str = None) -> logging.Logger: | |
"""Set up logger with configuration from config file.""" | |
logger = logging.getLogger(name or __name__) | |
# Set level from config | |
level = getattr(logging, config["logging"]["level"].upper()) | |
logger.setLevel(level) | |
# Create logs directory if it doesn't exist | |
log_path = Path(config["folders"]["logs"]) | |
log_path.mkdir(exist_ok=True) | |
# Create handlers | |
file_handler = logging.FileHandler(log_path / config["logging"]["file"]) | |
console_handler = logging.StreamHandler() | |
# Create formatter | |
formatter = logging.Formatter(config["logging"]["format"]) | |
file_handler.setFormatter(formatter) | |
console_handler.setFormatter(formatter) | |
# Add handlers | |
logger.addHandler(file_handler) | |
logger.addHandler(console_handler) | |
# Redirect stdout to logger | |
stream_to_logger = StreamToLogger(logger, logging.INFO) | |
sys.stdout = stream_to_logger | |
# Add methods to enable/disable StreamToLogger | |
logger.enable_stream_to_logger = stream_to_logger.enable | |
logger.disable_stream_to_logger = stream_to_logger.disable | |
return logger |