summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2014-10-26 16:27:15 +0000
committerelie <elie>2014-10-26 16:27:15 +0000
commit28cdc98c04bef6336a398cb496ebd3025a2ba800 (patch)
tree5172114f0806113537b8d68dfc23d9c9d1cfaac5
parente2469877057a0f5a6171a532ce3e6207ef27395e (diff)
downloadpyasn1-28cdc98c04bef6336a398cb496ebd3025a2ba800.tar.gz
built-in debugging is now based on Python logging module
-rw-r--r--CHANGES1
-rw-r--r--pyasn1/debug.py39
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 '<python built-in logging>'
+
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):