Skip to content

Commit bcb0774

Browse files
committed
Make json formatting optional
fixes #96
1 parent a053e99 commit bcb0774

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

fluent/handler.py

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,12 @@ class FluentRecordFormatter(logging.Formatter, object):
2626
:param datefmt: strftime()-compatible date/time format string.
2727
:param style: '%', '{' or '$' (used only with Python 3.2 or above)
2828
:param fill_missing_fmt_key: if True, do not raise a KeyError if the format
29-
key is not found. Put None if not found.s
29+
key is not found. Put None if not found.
30+
:param format_json: if True, will attempt to parse message as json. If not,
31+
will use message as-is. Defaults to True
3032
"""
31-
def __init__(self, fmt=None, datefmt=None, style='%', fill_missing_fmt_key=False):
33+
34+
def __init__(self, fmt=None, datefmt=None, style='%', fill_missing_fmt_key=False, format_json=True):
3235
super(FluentRecordFormatter, self).__init__(None, datefmt)
3336

3437
if sys.version_info[0:2] >= (3, 2) and style != '%':
@@ -57,6 +60,11 @@ def __init__(self, fmt=None, datefmt=None, style='%', fill_missing_fmt_key=False
5760
else:
5861
self._fmt_dict = fmt
5962

63+
if format_json:
64+
self._format_msg = self._format_msg_json
65+
else:
66+
self._format_msg = self._format_msg_default
67+
6068
self.hostname = socket.gethostname()
6169

6270
self.fill_missing_fmt_key = fill_missing_fmt_key
@@ -107,18 +115,23 @@ def _structuring(self, data, record):
107115
if isinstance(msg, dict):
108116
self._add_dic(data, msg)
109117
elif isinstance(msg, basestring):
110-
try:
111-
json_msg = json.loads(str(msg))
112-
if isinstance(json_msg, dict):
113-
self._add_dic(data, json_msg)
114-
else:
115-
self._add_dic(data, {'message': str(json_msg)})
116-
except ValueError:
117-
msg = record.getMessage()
118-
self._add_dic(data, {'message': msg})
118+
self._add_dic(data, self._format_msg(record, msg))
119119
else:
120120
self._add_dic(data, {'message': msg})
121121

122+
def _format_msg_json(self, record, msg):
123+
try:
124+
json_msg = json.loads(str(msg))
125+
if isinstance(json_msg, dict):
126+
return json_msg
127+
else:
128+
return {'message': str(json_msg)}
129+
except ValueError:
130+
return self._format_msg_default(record, msg)
131+
132+
def _format_msg_default(self, record, msg):
133+
return {'message': record.getMessage()}
134+
122135
@staticmethod
123136
def _add_dic(data, dic):
124137
for key, value in dic.items():
@@ -130,6 +143,7 @@ class FluentHandler(logging.Handler):
130143
'''
131144
Logging Handler for fluent.
132145
'''
146+
133147
def __init__(self,
134148
tag,
135149
host='localhost',

tests/test_handler.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,20 @@ def test_json_encoded_message(self):
165165
self.assertTrue('key' in data[0][2])
166166
self.assertEqual('hello world!', data[0][2]['key'])
167167

168+
def test_json_encoded_message_without_json(self):
169+
handler = fluent.handler.FluentHandler('app.follow', port=self._port)
170+
171+
logging.basicConfig(level=logging.INFO)
172+
log = logging.getLogger('fluent.test')
173+
handler.setFormatter(fluent.handler.FluentRecordFormatter(format_json=False))
174+
log.addHandler(handler)
175+
log.info('{"key": "hello world!", "param": "value"}')
176+
handler.close()
177+
178+
data = self.get_data()
179+
self.assertTrue('key' not in data[0][2])
180+
self.assertEqual('{"key": "hello world!", "param": "value"}', data[0][2]['message'])
181+
168182
def test_unstructured_message(self):
169183
handler = fluent.handler.FluentHandler('app.follow', port=self._port)
170184

0 commit comments

Comments
 (0)