logging: Add support for custom handlers.

Any custom handlers will be passed a LogRecord instance which has members
and a dict with "levelname", "message" and "name", to be used for creating
a log message.  The handler list is a global singleton so that sub-logging
objects all use the same set of (root) handlers.

The name of the root handler is also changed from None to "root", to match
CPython.

Signed-off-by: Damien George <damien@micropython.org>
pull/205/merge
Damien George 2020-07-08 15:54:21 +10:00
rodzic dedf328503
commit 7b1161dd1b
2 zmienionych plików z 40 dodań i 8 usunięć

Wyświetl plik

@ -13,3 +13,10 @@ try:
1/0
except:
log.exception("Some trouble (%s)", "expected")
class MyHandler(logging.Handler):
def emit(self, record):
print("levelname=%(levelname)s name=%(name)s message=%(message)s" % record.__dict__)
logging.getLogger().addHandler(MyHandler())
logging.info("Test message7")

Wyświetl plik

@ -17,9 +17,25 @@ _level_dict = {
_stream = sys.stderr
class LogRecord:
def __init__(self):
self.__dict__ = {}
def __getattr__(self, key):
return self.__dict__[key]
class Handler:
def __init__(self):
pass
def setFormatter(self, fmtr):
pass
class Logger:
level = NOTSET
handlers = []
record = LogRecord()
def __init__(self, name):
self.name = name
@ -37,12 +53,19 @@ class Logger:
return level >= (self.level or _level)
def log(self, level, msg, *args):
if level >= (self.level or _level):
_stream.write("%s:%s:" % (self._level_str(level), self.name))
if not args:
print(msg, file=_stream)
if self.isEnabledFor(level):
level = self._level_str(level)
if args:
msg = msg % args
if self.handlers:
d = self.record.__dict__
d["levelname"] = level
d["message"] = msg
d["name"] = self.name
for h in self.handlers:
h.emit(self.record)
else:
print(msg % args, file=_stream)
print(level, ":", self.name, ":", msg, sep="", file=_stream)
def debug(self, msg, *args):
self.log(DEBUG, msg, *args)
@ -66,11 +89,13 @@ class Logger:
def exception(self, msg, *args):
self.exc(sys.exc_info()[1], msg, *args)
def addHandler(self, hndlr):
self.handlers.append(hndlr)
_level = INFO
_loggers = {}
def getLogger(name):
def getLogger(name="root"):
if name in _loggers:
return _loggers[name]
l = Logger(name)
@ -78,10 +103,10 @@ def getLogger(name):
return l
def info(msg, *args):
getLogger(None).info(msg, *args)
getLogger().info(msg, *args)
def debug(msg, *args):
getLogger(None).debug(msg, *args)
getLogger().debug(msg, *args)
def basicConfig(level=INFO, filename=None, stream=None, format=None):
global _level, _stream