From fe671a8dc4a200701ee3240b0d53a7e935757dba Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 20 Jul 2021 12:15:44 +0200 Subject: [PATCH] utils: include exception logging in log_http_request (#55516) --- passerelle/utils/__init__.py | 4 +++- tests/test_proxylogger.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/passerelle/utils/__init__.py b/passerelle/utils/__init__.py index 29ab5d05..fead3a7e 100644 --- a/passerelle/utils/__init__.py +++ b/passerelle/utils/__init__.py @@ -188,6 +188,7 @@ def log_http_request(logger, request, response=None, exception=None, error_log=T log_function = logger.info message = '' extra = extra or {} + kwargs = {} if request is not None: message = '%s %s' % (request.method, request.url) @@ -222,11 +223,12 @@ def log_http_request(logger, request, response=None, exception=None, error_log=T message = repr(exception) extra['response_exception'] = repr(exception) log_function = logger.error + kwargs['exc_info'] = exception # allow resources to disable any error log at requests level if not error_log: log_function = logger.info - log_function(message, extra=extra) + log_function(message, extra=extra, **kwargs) # Wrapper around requests.Session diff --git a/tests/test_proxylogger.py b/tests/test_proxylogger.py index 96b1df60..6ce903a0 100644 --- a/tests/test_proxylogger.py +++ b/tests/test_proxylogger.py @@ -5,6 +5,7 @@ import itertools import logging import pytest +import requests import utils from django.core.exceptions import ValidationError from django.utils.log import AdminEmailHandler @@ -381,3 +382,16 @@ def test_logged_requests_and_responses_max_size(app, db, monkeypatch, settings): assert ResourceLog.objects.all()[1].extra.get('response_content') == '\'{"service_reply_var": "33\'' else: assert ResourceLog.objects.all()[1].extra.get('response_content') == 'b\'{"service_reply_var": "33\'' + + +def test_proxy_logger_email_traceback(app, db, email_handler, settings, mailoutbox, connector, monkeypatch): + settings.ADMINS = [('admin', 'admin@example.net')] + endpoint_url = utils.generic_endpoint_url('feeds', 'json', slug=connector.slug) + + @endpoint() + def json(self, request): + raise requests.ConnectionError('timeout') + + monkeypatch.setattr(Feed, 'json', json) + resp = app.get(endpoint_url, status=500) + assert any('traceback' in mail.body.lower() for mail in mailoutbox) -- 2.20.1