From 28cdc98c04bef6336a398cb496ebd3025a2ba800 Mon Sep 17 00:00:00 2001 From: elie Date: Sun, 26 Oct 2014 16:27:15 +0000 Subject: built-in debugging is now based on Python logging module --- CHANGES | 1 + pyasn1/debug.py | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 4e17c10..ef13d0d 100644 --- a/CHANGES +++ b/CHANGES @@ -42,6 +42,7 @@ Revision 0.1.8 - The OctetString.__int__() and .__float__() magic methods implemented. - Handle the case of null writer at Debug printer. - BitString encoder/decoder performance improved. +- Built-in debugging is now based on Python logging module. - Fix to NamedType.__repr__() to work properly. - Fixes to __repr__() implementation of many built-in ASN.1 types to take into account all of their initializers such as tagSet, subtypeSpec etc. diff --git a/pyasn1/debug.py b/pyasn1/debug.py index 21d9e3c..e9ff719 100644 --- a/pyasn1/debug.py +++ b/pyasn1/debug.py @@ -1,4 +1,5 @@ -import sys +import time +import logging from pyasn1.compat.octets import octs2ints from pyasn1 import error from pyasn1 import __version__ @@ -14,13 +15,33 @@ flagMap = { 'all': flagAll } +class Printer: + def __init__(self, logger=None, handler=None, formatter=None): + if logger is None: + logger = logging.getLogger('pyasn1') + logger.setLevel(logging.DEBUG) + if handler is None: + handler = logging.StreamHandler() + if formatter is None: + formatter = logging.Formatter('%(name)s: %(message)s') + handler.setFormatter(formatter) + handler.setLevel(logging.DEBUG) + logger.addHandler(handler) + self.__logger = logger + + def __call__(self, msg): self.__logger.debug(msg) + def __str__(self): return '' + class Debug: - defaultPrinter = sys.stderr and sys.stderr.write or None - def __init__(self, *flags): + defaultPrinter = None + def __init__(self, *flags, **options): self._flags = flagNone - if not self.defaultPrinter: - raise error.PyAsn1Error('Null debug writer specified') - self._printer = self.defaultPrinter + if options.get('printer') is not None: + self._printer = options.get('printer') + elif self.defaultPrinter is not None: + self._printer = self.defaultPrinter + else: + self._printer = Printer() self('running pyasn1 version %s' % __version__) for f in flags: if f not in flagMap: @@ -32,7 +53,7 @@ class Debug: return 'logger %s, flags %x' % (self._printer, self._flags) def __call__(self, msg): - self._printer('DBG: %s\n' % msg) + self._printer('[%s]: %s' % (self.timestamp(), msg)) def __and__(self, flag): return self._flags & flag @@ -40,6 +61,10 @@ class Debug: def __rand__(self, flag): return flag & self._flags + def timestamp(self): + return time.strftime('%H:%M:%S', time.localtime()) + \ + '.%.3d' % int((time.time() % 1) * 1000) + logger = 0 def setLogger(l): -- cgit v1.2.1