From 0f009edd8e70f3651f63c2000a8c0d659d307d8a Mon Sep 17 00:00:00 2001 From: Maks Snegov Date: Mon, 3 May 2021 13:39:53 +0300 Subject: [PATCH] Add HTTP logger --- spqr/kieran/httplog.py | 57 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 spqr/kieran/httplog.py diff --git a/spqr/kieran/httplog.py b/spqr/kieran/httplog.py new file mode 100644 index 0000000..1758689 --- /dev/null +++ b/spqr/kieran/httplog.py @@ -0,0 +1,57 @@ +""" +Enable HTTP requests/responses logging. + +Usage: + +>>> import logging +>>> from spqr.kieran.httplog import logRoundtrip, HttpFormatter + +>>> formatter = HttpFormatter("{asctime}|{levelname}|{threadName}|{message}", style="{") +>>> handler = logging.StreamHandler() +>>> handler.setFormatter(formatter) +>>> logging.basicConfig(level=loglevel, handlers=[handler]) + +>>> session = requests.Session() +>>> session.hooks['response'].append(logRoundtrip) + +""" + +import logging +import textwrap + +_lg = logging.getLogger('httplogger') + + +def logRoundtrip(response, *args, **kwargs): + """ Requests hook to log HTTP request and response. """ + extra = {'req': response.request, 'res': response} + _lg.debug('HTTP roundtrip', extra=extra) + + +class HttpFormatter(logging.Formatter): + + def _formatHeaders(self, d): + return '\n'.join(f'{k}: {v}' for k, v in d.items()) + + def formatMessage(self, record): + result = super().formatMessage(record) + if record.name == 'httplogger': + result += textwrap.dedent(''' + ---------------- request ---------------- + {req.method} {req.url} + {reqhdrs} + + {req.body} + ---------------- response ---------------- + {res.status_code} {res.reason} {res.url} + {reshdrs} + + {res.text} + ''').format( + req=record.req, + res=record.res, + reqhdrs=self._formatHeaders(record.req.headers), + reshdrs=self._formatHeaders(record.res.headers), + ) + + return result