# -*- coding: utf-8 -*- import sys, syslog, datetime 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 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 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 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: 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