fluent / fluent/fluent-logger-python

_format_msg_json doesn't merge arguments

Aperta
#170 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Python
Stelle
457
Fork
138
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

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'])
```

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.