From 35f18987b9c5618642ea72b701d619df60685b6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 14 Aug 2018 16:21:47 +0200 Subject: [PATCH] general: use connector logger in to_json() (#25689) --- passerelle/base/models.py | 10 ++++++++++ passerelle/utils/jsonresponse.py | 9 ++++++--- passerelle/views.py | 3 ++- tests/test_generic_endpoint.py | 4 ++-- tests/test_jsonresponse.py | 2 +- tests/test_manager.py | 7 ++++--- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/passerelle/base/models.py b/passerelle/base/models.py index b3cd69f..0a05462 100644 --- a/passerelle/base/models.py +++ b/passerelle/base/models.py @@ -5,6 +5,8 @@ import inspect import logging import os import re +import sys +import traceback import base64 from django.apps import apps @@ -533,10 +535,18 @@ class ProxyLogger(object): sourceip = None attr['sourceip'] = sourceip + if kwargs.get('exc_info'): + (exc_type, exc_value, tb) = sys.exc_info() + attr['extra']['error_summary'] = traceback.format_exception_only(exc_type, exc_value) + ResourceLog.objects.create(**attr) getattr(self._logger, levelname.lower())(message, *args, **kwargs) + def exception(self, message, *args, **kwargs): + kwargs['exc_info'] = 1 + self._log('ERROR', message, *args, **kwargs) + def debug(self, message, *args, **kwargs): self._log('DEBUG', message, *args, **kwargs) diff --git a/passerelle/utils/jsonresponse.py b/passerelle/utils/jsonresponse.py index 4c41411..6db4e12 100644 --- a/passerelle/utils/jsonresponse.py +++ b/passerelle/utils/jsonresponse.py @@ -41,9 +41,10 @@ class JSONEncoder(DjangoJSONEncoder): class to_json(object): - def __init__(self, error_code=500, **kwargs): + def __init__(self, error_code=500, logger=None, **kwargs): self.error_code = error_code self.kwargs = kwargs + self.logger = logger if 'cls' not in self.kwargs: self.kwargs['cls'] = JSONEncoder @@ -115,7 +116,7 @@ class to_json(object): return self.api(f, args[1], *args, **kwargs) def api(self, f, req, *args, **kwargs): - logger = logging.getLogger('passerelle.jsonresponse') + logger = self.logger or logging.getLogger('passerelle.jsonresponse') try: resp = f(*args, **kwargs) if isinstance(resp, HttpResponse): @@ -124,7 +125,9 @@ class to_json(object): data = self.obj_to_response(req, resp) status = 200 except Exception as e: - extras = {'method': req.method, 'request': req} + extras = {'method': req.method, 'exception': repr(e)} + if not self.logger: + extras['request'] = req if req.method == 'POST': extras.update({'body': req.body}) if (not isinstance(e, (Http404, PermissionDenied, ObjectDoesNotExist, RequestException)) diff --git a/passerelle/views.py b/passerelle/views.py index 1babbce..8b07e01 100644 --- a/passerelle/views.py +++ b/passerelle/views.py @@ -356,7 +356,8 @@ class GenericEndpointView(GenericConnectorMixin, SingleObjectMixin, View): kwargs['other_params'] = match.kwargs elif kwargs.get('rest'): raise Http404() - return to_json()(self.perform)(request, *args, **kwargs) + connector = self.get_object() + return to_json(logger=connector.logger)(self.perform)(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.get(request, *args, **kwargs) diff --git a/tests/test_generic_endpoint.py b/tests/test_generic_endpoint.py index abf893f..664ab80 100644 --- a/tests/test_generic_endpoint.py +++ b/tests/test_generic_endpoint.py @@ -96,10 +96,10 @@ def test_proxy_logger(mocked_get, caplog, app, arcgis): else: assert log.message == 'this is an info test' + log = ResourceLog.objects.filter(appname='arcgis', slug='test').delete() + caplog.clear() resp = app.get('/arcgis/test/district', params={'lon': 6.172122, 'lat': 48.673836}, status=200) - logger.debug('new token: %s (timeout %ss)', 'hfgjsfg=', 45) - # Resource Custom DB Logger log = ResourceLog.objects.filter(appname='arcgis', slug='test').first() assert log.appname == 'arcgis' diff --git a/tests/test_jsonresponse.py b/tests/test_jsonresponse.py index e7fd9fc..29babdd 100644 --- a/tests/test_jsonresponse.py +++ b/tests/test_jsonresponse.py @@ -123,7 +123,7 @@ def test_jsonresponse_error_header(): assert 'err_class' in data assert 'err' in data assert data['err'] == 1 - assert data['err_class'] == 'test_jsonresponse.CustomException' + assert data['err_class'] == 'tests.test_jsonresponse.CustomException' assert result.status_code == 200 def test_jsonresponse_with_http4O4_exception(): diff --git a/tests/test_manager.py b/tests/test_manager.py index 5e85220..c262109 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -148,7 +148,8 @@ def test_logs(app, admin_user): assert 'endpoint GET /csvdatasource/test/query/foobar/?q=toto' in resp.text resp = resp.click('full page') - assert resp.text.count('') == 2 + assert resp.text.count('') == 4 + assert resp.text.count('Error occurred while processing request') == 2 resp.form['q'] = 'toto' resp = resp.form.submit() @@ -156,7 +157,7 @@ def test_logs(app, admin_user): resp.form['q'] = datetime.date.today().strftime('%d/%m/%Y') resp = resp.form.submit() - assert resp.text.count('') == 2 + assert resp.text.count('') == 4 resp.form['q'] = datetime.date.today().strftime('%d/%m/2010') resp = resp.form.submit() @@ -164,7 +165,7 @@ def test_logs(app, admin_user): resp.form['q'] = '' resp = resp.form.submit() - assert resp.text.count('') == 2 + assert resp.text.count('') == 4 log_pk = re.findall(r'data-pk="(.*)"', resp.text)[0] base_url = re.findall(r'data-log-base-url="(.*)"', resp.text)[0] resp = app.get(base_url + log_pk + '/') -- 2.18.0