summaryrefslogtreecommitdiff
path: root/crocoite/logger.py
diff options
context:
space:
mode:
Diffstat (limited to 'crocoite/logger.py')
-rw-r--r--crocoite/logger.py35
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