logging: Support extra context for LogRecord.

Extra context is usable to enrich log record with concrete context
additions.

Signed-off-by: Alon Bar-Lev <alon.barlev@gmail.com>
pull/1004/head
Alon Bar-Lev 2025-04-30 17:40:03 +03:00
rodzic 913498ef05
commit 784c55fdfb
1 zmienionych plików z 35 dodań i 31 usunięć

Wyświetl plik

@ -28,7 +28,7 @@ _default_datefmt = "%Y-%m-%d %H:%M:%S"
class LogRecord: class LogRecord:
def set(self, name, level, message): def __init__(self, name, level, message, extra=None):
self.name = name self.name = name
self.levelno = level self.levelno = level
self.levelname = _level_dict[level] self.levelname = _level_dict[level]
@ -36,6 +36,11 @@ class LogRecord:
self.ct = time.time() self.ct = time.time()
self.msecs = int((self.ct - int(self.ct)) * 1000) self.msecs = int((self.ct - int(self.ct)) * 1000)
self.asctime = None self.asctime = None
if extra is not None:
for key in extra:
if (key in ["message", "asctime"]) or (key in self.__dict__):
raise KeyError("Attempt to overwrite %r in LogRecord" % key)
setattr(self, key, extra[key])
class Handler: class Handler:
@ -110,7 +115,6 @@ class Logger:
self.name = name self.name = name
self.level = level self.level = level
self.handlers = [] self.handlers = []
self.record = LogRecord()
def setLevel(self, level): def setLevel(self, level):
self.level = level self.level = level
@ -121,36 +125,36 @@ class Logger:
def getEffectiveLevel(self): def getEffectiveLevel(self):
return self.level or getLogger().level or _DEFAULT_LEVEL return self.level or getLogger().level or _DEFAULT_LEVEL
def log(self, level, msg, *args): def log(self, level, msg, *args, extra=None):
if self.isEnabledFor(level): if self.isEnabledFor(level):
if args: if args:
if isinstance(args[0], dict): if isinstance(args[0], dict):
args = args[0] args = args[0]
msg = msg % args msg = msg % args
self.record.set(self.name, level, msg) record = LogRecord(self.name, level, msg, extra)
handlers = self.handlers handlers = self.handlers
if not handlers: if not handlers:
handlers = getLogger().handlers handlers = getLogger().handlers
for h in handlers: for h in handlers:
h.emit(self.record) h.emit(record)
def debug(self, msg, *args): def debug(self, msg, *args, **kwargs):
self.log(DEBUG, msg, *args) self.log(DEBUG, msg, *args, **kwargs)
def info(self, msg, *args): def info(self, msg, *args, **kwargs):
self.log(INFO, msg, *args) self.log(INFO, msg, *args, **kwargs)
def warning(self, msg, *args): def warning(self, msg, *args, **kwargs):
self.log(WARNING, msg, *args) self.log(WARNING, msg, *args, **kwargs)
def error(self, msg, *args): def error(self, msg, *args, **kwargs):
self.log(ERROR, msg, *args) self.log(ERROR, msg, *args, **kwargs)
def critical(self, msg, *args): def critical(self, msg, *args, **kwargs):
self.log(CRITICAL, msg, *args) self.log(CRITICAL, msg, *args, **kwargs)
def exception(self, msg, *args, exc_info=True): def exception(self, msg, *args, exc_info=True, **kwargs):
self.log(ERROR, msg, *args) self.log(ERROR, msg, *args, **kwargs)
tb = None tb = None
if isinstance(exc_info, BaseException): if isinstance(exc_info, BaseException):
tb = exc_info tb = exc_info
@ -178,32 +182,32 @@ def getLogger(name=None):
return _loggers[name] return _loggers[name]
def log(level, msg, *args): def log(level, msg, *args, **kwargs):
getLogger().log(level, msg, *args) getLogger().log(level, msg, *args, **kwarg)
def debug(msg, *args): def debug(msg, *args, **kwargs):
getLogger().debug(msg, *args) getLogger().debug(msg, *args, **kwargs)
def info(msg, *args): def info(msg, *args, **kwargs):
getLogger().info(msg, *args) getLogger().info(msg, *args, **kwargs)
def warning(msg, *args): def warning(msg, *args, **kwargs):
getLogger().warning(msg, *args) getLogger().warning(msg, *args, **kwargs)
def error(msg, *args): def error(msg, *args, **kwargs):
getLogger().error(msg, *args) getLogger().error(msg, *args, **kwargs)
def critical(msg, *args): def critical(msg, *args, **kwargs):
getLogger().critical(msg, *args) getLogger().critical(msg, *args, **kwargs)
def exception(msg, *args, exc_info=True): def exception(msg, *args, exc_info=True, **kwargs):
getLogger().exception(msg, *args, exc_info=exc_info) getLogger().exception(msg, *args, exc_info=exc_info, **kwargs)
def shutdown(): def shutdown():