fluent / fluent/fluent-logger-python
_format_msg_json doesn't merge arguments
- Dominant language
- Python
- Stars
- 457
- Forks
- 138
- PR merge metrics
- No merged PRs in 30d
Description
I'm using the `FluentHandler` class for Python logging module. I was hoping to pass a json string to the logger and have it interpreted as json, which it does, but the `FluentRecordFormatter` doesn't merge logged arguments in.
Example
```
logger = logging.getLogger('fluent.test')
logger.info('{"from": "%(a)s", "to": "%(b)s"}', {"a":"userA","b":"userB"})
```
Expected result
```
{"type":"INFO","from": "userA", "to": "userB"}
```
Actual result
```
{"type":"INFO","from":"%(a)s","to":"%(b)s"}
```
I expected the arguments to be merged in based on the behaviour of the [default Python formatter](https://github.com/python/cpython/blob/46abfc1416ff8e450999611ef8f231ff871ab133/Lib/logging/__init__.py#L664) which calls [`record.getMessage`](https://github.com/python/cpython/blob/46abfc1416ff8e450999611ef8f231ff871ab133/Lib/logging/__init__.py#L369) which merges in arguments
```
if self.args:
msg = msg % self.args
```
However, the behaviour of the `FluentRecordFormatter` is to [`json.loads(str(msg))`](https://github.com/fluent/fluent-logger-python/blob/7389fb6600f57b6eb21c854019df7d06a79fbb57/fluent/handler.py#L130) the message, and ignore any arguments.
Would it be suitable to merge in the arguments when loading the json? I'd be happy to contribute a PR for it. [Here's a test that would cover it.](https://github.com/fluent/fluent-logger-python/blob/7389fb6600f57b6eb21c854019df7d06a79fbb57/tests/test_handler.py)
```
def test_json_encoded_message_with_args(self):
handler = fluent.handler.FluentHandler('app.follow', port=self._port)
with handler:
logging.basicConfig(level=logging.INFO)
log = logging.getLogger('fluent.test')
handler.setFormatter(fluent.handler.FluentRecordFormatter())
log.addHandler(handler)
log.info('{"key": "%(a)s", "param": "value"}', {"a": "hello world!"})
log.removeHandler(handler)
data = self.get_data()
self.assertTrue('key' in data[0][2])
self.assertEqual('hello world!', data[0][2]['key'])
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.