import datetime import sys import syslog # fmt: disable # don't conflate EMERG = int(syslog.LOG_EMERG) ALERT = int(syslog.LOG_ALERT) CRIT = int(syslog.LOG_CRIT) ERR = int(syslog.LOG_ERR) WARNING = int(syslog.LOG_WARNING) NOTICE = int(syslog.LOG_NOTICE) INFO = int(syslog.LOG_INFO) DEBUG = int(syslog.LOG_DEBUG) DEVEL = int(syslog.LOG_DEBUG + 1) OFF = DEVEL + 1 _log_level = NOTICE _last_tstamp = datetime.datetime.now() _first_tstamp = _last_tstamp # fmt: enable def _log_level_name_by_value(): if _log_level_name_by_value.map is None: _log_level_name_by_value.map = { EMERG: 'EMERG', ALERT: 'ALERT', CRIT: 'CRIT', ERR: 'ERR', WARNING: 'WARNING', NOTICE: 'NOTICE', INFO: 'INFO', DEBUG: 'DEBUG', DEVEL: 'DEVEL', OFF: 'OFF', } return _log_level_name_by_value.map _log_level_name_by_value.map: dict[int, str] | None = None # type: ignore def _log_level_value_by_name(): if _log_level_value_by_name.map is None: _log_level_value_by_name.map = {} for value, name in _log_level_name_by_value().items(): _log_level_value_by_name.map[name] = value _log_level_value_by_name.map[name.lower()] = value return _log_level_value_by_name.map _log_level_value_by_name.map: dict[str, int] | None = None # type: ignore def get_log_level_name(level: int) -> str: return _log_level_name_by_value()[level] def parse_log_level(level: str | int) -> int: try: ret = int(level) if ret >= 0 and ret <= DEVEL: return ret except ValueError: return _log_level_value_by_name()[level] raise Exception('Invalid log level ', level) def set_log_level(level: str | int | None = None) -> int: global _log_level ret = _log_level if level is not None: _log_level = parse_log_level(level) return ret def set_log_flags(*args, **kwargs): pass def log(prio: int, *args, **kwargs): global _log_level if prio > _log_level: return print(*args, file = sys.stderr) def log_time_diff(prio: int, *args, **kwargs): global _last_tstamp now = datetime.datetime.now() log(prio, now - _last_tstamp, now - _first_tstamp, *args) _last_tstamp = now