diff options
Diffstat (limited to 'crocoite/logger.py')
-rw-r--r-- | crocoite/logger.py | 35 |
1 files changed, 15 insertions, 20 deletions
diff --git a/crocoite/logger.py b/crocoite/logger.py index 4b43e02..ac389ca 100644 --- a/crocoite/logger.py +++ b/crocoite/logger.py @@ -32,6 +32,10 @@ from datetime import datetime from functools import partial from enum import IntEnum +from pytz import utc + +from .util import StrJsonEncoder + class Level(IntEnum): DEBUG = 0 INFO = 1 @@ -39,9 +43,9 @@ class Level(IntEnum): ERROR = 3 class Logger: - def __init__ (self, consumer=[], bindings={}): - self.bindings = bindings - self.consumer = consumer + def __init__ (self, consumer=None, bindings=None): + self.bindings = bindings or {} + self.consumer = consumer or [] def __call__ (self, level, *args, **kwargs): if not isinstance (level, Level): @@ -83,7 +87,7 @@ class Logger: self.consumer.remove (consumer) class Consumer: - def __call__ (self, level, *args, **kwargs): + def __call__ (self, **kwargs): # pragma: no cover raise NotImplementedError () class NullConsumer (Consumer): @@ -97,41 +101,32 @@ class PrintConsumer (Consumer): def __call__ (self, **kwargs): sys.stderr.write (str (kwargs)) sys.stderr.write ('\n') + sys.stderr.flush () return kwargs -class JsonEncoder (json.JSONEncoder): - def default (self, obj): - if isinstance (obj, datetime): - return obj.isoformat () - - # make sure serialization always succeeds - try: - return json.JSONEncoder.default(self, obj) - except TypeError: - return str (obj) - class JsonPrintConsumer (Consumer): - def __init__ (self, minLevel=Level.INFO): + def __init__ (self, minLevel=Level.DEBUG): self.minLevel = minLevel def __call__ (self, **kwargs): if kwargs['level'] >= self.minLevel: - json.dump (kwargs, sys.stdout, cls=JsonEncoder) + json.dump (kwargs, sys.stdout, cls=StrJsonEncoder) sys.stdout.write ('\n') + sys.stdout.flush () return kwargs class DatetimeConsumer (Consumer): def __call__ (self, **kwargs): - kwargs['date'] = datetime.utcnow () + kwargs['date'] = datetime.utcnow ().replace (tzinfo=utc) return kwargs class WarcHandlerConsumer (Consumer): - def __init__ (self, warc, minLevel=Level.INFO): + def __init__ (self, warc, minLevel=Level.DEBUG): self.warc = warc self.minLevel = minLevel def __call__ (self, **kwargs): if kwargs['level'] >= self.minLevel: - self.warc._writeLog (json.dumps (kwargs, cls=JsonEncoder)) + self.warc._writeLog (json.dumps (kwargs, cls=StrJsonEncoder)) return kwargs |