kopia lustrzana https://github.com/micropython/micropython-lib
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
rodzic
dedf328503
commit
7b1161dd1b
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
Ładowanie…
Reference in New Issue