From f7cc364be28e83ed9be5fc5be421200823875ab9 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 21 Jan 2026 14:54:44 +0100 Subject: [PATCH] lib.log: Add module A dedicated logging module is currently provided by jw-python, but since it's often needed also in jw-pkg, and it's relatively small and maintainable, it seems justified to move it into jw-pkg. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/lib/log.py | 78 ++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/python/jw/pkg/lib/log.py diff --git a/src/python/jw/pkg/lib/log.py b/src/python/jw/pkg/lib/log.py new file mode 100644 index 00000000..5e4e03a2 --- /dev/null +++ b/src/python/jw/pkg/lib/log.py @@ -0,0 +1,78 @@ +# -*- 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