Skip to content

Commit a98b7bf

Browse files
committed
Allow to pass custom loads and dumps to JsonFormatter
1 parent a5561e5 commit a98b7bf

File tree

3 files changed

+139
-3
lines changed

3 files changed

+139
-3
lines changed

jsonformatter/jsonformatter.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ class JsonFormatter(logging.Formatter):
162162

163163
def parseFmt(self, fmt):
164164
if isinstance(fmt, str):
165-
return json.loads(fmt, object_pairs_hook=dictionary)
165+
return self.loads(fmt, object_pairs_hook=dictionary)
166166
elif isinstance(fmt, dictionary):
167167
return fmt
168168
elif isinstance(fmt, dict):
@@ -216,7 +216,28 @@ def wrapper(*args, **kwargs):
216216
else:
217217
return
218218

219-
def __init__(self, fmt=BASIC_FORMAT, datefmt=None, style='%', record_custom_attrs=None, mix_extra=False, mix_extra_position='tail', skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw):
219+
def __init__(
220+
self,
221+
fmt=BASIC_FORMAT,
222+
datefmt=None,
223+
style='%',
224+
record_custom_attrs=None,
225+
mix_extra=False,
226+
mix_extra_position='tail',
227+
skipkeys=False,
228+
ensure_ascii=True,
229+
check_circular=True,
230+
allow_nan=True,
231+
cls=None,
232+
indent=None,
233+
separators=None,
234+
encoding='utf-8',
235+
default=None,
236+
sort_keys=False,
237+
dumps=json.dumps,
238+
loads=json.loads,
239+
**kw,
240+
):
220241
"""
221242
If ``style`` not in ``['%', '{', '$']``, a ``ValueError`` will be raised.
222243
@@ -269,6 +290,9 @@ def __init__(self, fmt=BASIC_FORMAT, datefmt=None, style='%', record_custom_attr
269290
If *sort_keys* is true (default: ``False``), then the output of
270291
dictionaries will be sorted by key.
271292
293+
``dumps`` custom function to use instead of json.dumps
294+
``loads`` custom function to use instead of json.loads
295+
272296
To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
273297
``.default()`` method to serialize additional types), specify it with
274298
the ``cls`` kwarg; otherwise ``JSONEncoder`` is used.
@@ -290,6 +314,8 @@ def __init__(self, fmt=BASIC_FORMAT, datefmt=None, style='%', record_custom_attr
290314
self, fmt='', datefmt=datefmt, style=style)
291315
# compatible python2 end
292316

317+
self.dumps = dumps
318+
self.loads = loads
293319
self.json_fmt = self.parseFmt(fmt)
294320
self.record_custom_attrs = record_custom_attrs
295321
self._style = _STYLES[style](self.json_fmt)
@@ -424,7 +450,7 @@ def _set_fmt_to_result():
424450
record.__extra = extra
425451
# store __extra end
426452

427-
return json.dumps(
453+
return self.dumps(
428454
result,
429455
skipkeys=self.skipkeys,
430456
ensure_ascii=self.ensure_ascii,

test/test.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
Description: jsonformatter.py
1010
"""
1111
import datetime
12+
import json
1213
import logging
1314
import os
1415
import random
@@ -486,6 +487,60 @@ def test_basic_config_format(self):
486487
)
487488
logging.info('basic config format')
488489

490+
def test_custom_json_lib_dict_config(self):
491+
def my_dumps(*args, **kwargs):
492+
return json.dumps(*args, **kwargs)
493+
494+
def my_loads(*args, **kwargs):
495+
return json.loads(*args, **kwargs)
496+
497+
log_format = """{
498+
"levelname": "levelname",
499+
"name": "name",
500+
"log": "message"
501+
}"""
502+
log_level = "DEBUG"
503+
504+
formatters = {
505+
"default": {
506+
"()": "jsonformatter.JsonFormatter",
507+
"fmt": log_format,
508+
"indent": None,
509+
"ensure_ascii": False,
510+
"dumps": my_dumps,
511+
"loads": my_loads,
512+
},
513+
}
514+
515+
handlers = {
516+
"default": {
517+
"level": log_level,
518+
"class": "logging.StreamHandler",
519+
"stream": "ext://sys.stdout",
520+
"formatter": "default",
521+
}
522+
523+
}
524+
loggers = {
525+
"": {
526+
"handlers": ["default"],
527+
"level": log_level,
528+
"propagate": False,
529+
},
530+
}
531+
532+
config = {
533+
"version": 1,
534+
"disable_existing_loggers": False,
535+
"formatters": formatters,
536+
"handlers": handlers,
537+
"loggers": loggers,
538+
}
539+
540+
logging.config.dictConfig(config)
541+
logger = logging.getLogger("test-logger")
542+
logger.debug("check if works (it does)")
543+
489544
def tearDown(self):
490545
root = logging.getLogger()
491546
# remove handlers

test/test_windows.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
Description: jsonformatter.py
1010
"""
1111
import datetime
12+
import json
1213
import logging
1314
import os
1415
import random
@@ -497,6 +498,60 @@ def test_basic_config_format(self):
497498
)
498499
logging.info('basic config format')
499500

501+
def test_custom_json_lib_dict_config(self):
502+
def my_dumps(*args, **kwargs):
503+
return json.dumps(*args, **kwargs)
504+
505+
def my_loads(*args, **kwargs):
506+
return json.loads(*args, **kwargs)
507+
508+
log_format = """{
509+
"levelname": "levelname",
510+
"name": "name",
511+
"log": "message"
512+
}"""
513+
log_level = "DEBUG"
514+
515+
formatters = {
516+
"default": {
517+
"()": "jsonformatter.JsonFormatter",
518+
"fmt": log_format,
519+
"indent": None,
520+
"ensure_ascii": False,
521+
"dumps": my_dumps,
522+
"loads": my_loads,
523+
},
524+
}
525+
526+
handlers = {
527+
"default": {
528+
"level": log_level,
529+
"class": "logging.StreamHandler",
530+
"stream": "ext://sys.stdout",
531+
"formatter": "default",
532+
}
533+
534+
}
535+
loggers = {
536+
"": {
537+
"handlers": ["default"],
538+
"level": log_level,
539+
"propagate": False,
540+
},
541+
}
542+
543+
config = {
544+
"version": 1,
545+
"disable_existing_loggers": False,
546+
"formatters": formatters,
547+
"handlers": handlers,
548+
"loggers": loggers,
549+
}
550+
551+
logging.config.dictConfig(config)
552+
logger = logging.getLogger("test-logger")
553+
logger.debug("check if works (it does)")
554+
500555
def tearDown(self):
501556
root = logging.getLogger()
502557
# remove handlers

0 commit comments

Comments
 (0)