1

I have a Python FASTAPI application which I run through Uvicorn.

I have a dependent service and I generate a python client using the swaggen-codegen provided by the openapi.json of the dependent service.

My logger dictconfig is:

def get_logging_config():
    return { 
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': { 
            'standard': {
                '()': ColoredFormatter
            },
        },
        'handlers': { 
            'console': { 
                'level': logging.getLevelName(logging.DEBUG),
                'formatter': 'standard',
                'class': 'logging.StreamHandler',
                'stream': 'ext://sys.stdout'
            }
        },
        'loggers': { 
            '': {  # root logger
                'handlers': ['console'],
                'level': logging.getLevelName(get_logging_level()),
                'propagate': False
            },
            'uvicorn': {  # uvicorn logger
                'handlers': ['console'],
                'level': logging.getLevelName(logging.WARN),
                'propagate': False
            },
            'urllib3': {  # urllib3 logger
                'handlers': ['console'],
                'level': logging.getLevelName(logging.DEBUG),
                'propagate': False
            },
            'urllib3.connectionpool': {  # urllib3 logger for HTTP calls
                'handlers': ['console'],
                'level': logging.getLevelName(logging.DEBUG),
                'propagate': False
            },
            'requests.packages.urllib3': {
                'handlers': ['console'],
                'level': logging.getLevelName(logging.DEBUG),
                'propagate': True
            }
        } 
    }

My logging module init.py contains:

import logging
import logging.config
from .http_client_logger import httpclient_logging_patch

from .logging_config import get_logging_config

httpclient_logging_patch()

logging.config.dictConfig(get_logging_config())

My http_client_logger.py file looks like:

import logging
import http.client

httpclient_logger = logging.getLogger("http.client")

def httpclient_logging_patch(level=logging.DEBUG):
    """Enable HTTPConnection debug logging to the logging framework"""

    def httpclient_log(*args):
        httpclient_logger.log(level, "test-" + "".join(args))

    # mask the print() built-in in the http.client module to use
    # logging instead
    http.client.print = httpclient_log
    # enable debugging
    http.client.HTTPConnection.debuglevel = 1
    http.client.HTTPSConnection.debuglevel = 1

The logs which I could see are

2023-01-14 20:18:02.384 - DEBUG - https://test-dependent-service-url.com:443 "POST /test-endpoint HTTP/1.1" 200 None (urllib3.connectionpool:_make_request:456)

2023-01-14 20:18:02.385 - DEBUG - response body: b'{"data":[],"id":"93d0f81a-3d4e-4ae6-9c47-07adde47400a","timestamp":"2023-01-14T19:18:02.489899239Z"}' (dependent_service.client.swagger_client.rest:request:219)

I would like to log the request sent (POST, GET, PUT, DELETE) to the dependent service and response received from the dependent service which contains the body of the request and response. Note that I am using an HTTPS connection. But in the logs, the request body is not being logged. Also, in none of the cases, the headers are getting logged.

Please, anyone could help here?

I have tried the following:

  1. Log all requests from the python-requests module

  2. I have also tried to put the debuglevel to 2 but nothing helped

    http.client.HTTPConnection.debuglevel = 2
    http.client.HTTPSConnection.debuglevel = 2
    
  3. https://bhoey.com/blog/better-debug-logging-for-the-python-requests-library/ It talks about the file handler but it same as previous and I am using StreamHandler.

Although it works for GET but not for POST.

Aman Sinha
  • 11
  • 5

0 Answers0