import logging from datetime import datetime from typing import Any, Dict, Tuple from owslib.logger.constants import RESERVED_FIELDS def get_extra_fields( record: logging.LogRecord, reserved: Tuple[str, ...] = RESERVED_FIELDS ) -> Dict[str, Any]: easy_types = (str, bool, dict, float, int, list, type(None)) fields = {} for key, value in record.__dict__.items(): if key not in reserved: if isinstance(value, easy_types): fields[key] = value else: fields[key] = repr(value) return fields def format_timestamp(time: float) -> str: tstamp = datetime.utcfromtimestamp(time) return ( tstamp.strftime("%Y-%m-%dT%H:%M:%S") + ".%03d" % (tstamp.microsecond / 1000) + "Z" ) def get_status_code_log_level(status_code: int) -> int: level = logging.INFO if 299 < status_code < 499: level = logging.WARNING elif 499 < status_code: level = logging.ERROR return level