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 <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-01-21 14:54:44 +01:00
commit f7cc364be2

View file

@ -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