import logging import os import re import colorlog class StreamHandler(logging.StreamHandler): def __init__(self, stream=None): super().__init__(stream=stream) if os.getenv("LOGGING_COLOR"): self.formatter = colorlog.ColoredFormatter( style="{", fmt=( "{bold}[{asctime}] {white}({name}) " "{bold}{log_color}{levelname}{reset} - {log_color}{message}" ), ) else: self.formatter = logging.Formatter( style="{", fmt="[{asctime}] ({name}) {levelname} - {message}", ) class GunicornRequestPathFilter(logging.Filter): logger_name = "gunicorn.access" def __init__(self, ignore_path_re: str): super().__init__() self.path_filter = re.compile(ignore_path_re) def filter(self, record: logging.LogRecord) -> bool: if record.name == self.logger_name and isinstance(record.args, dict): try: path = record.args["U"] except KeyError: pass else: return not self.path_filter.match(path) return True class GunicornStreamHandler(StreamHandler): def __init__(self, stream=None): super().__init__(stream=stream) self.addFilter( GunicornRequestPathFilter( ignore_path_re=r"^(/static*|/metrics*|/health*)", ) )