[파이썬] aiohttp 요청 및 응답 로깅 커스텀화

aiohttp is a popular asynchronous HTTP client/server framework for Python. It allows developers to build fast and efficient web applications. One useful feature of aiohttp is the ability to customize request and response logging. In this blog post, we will explore how to customize logging in aiohttp to suit our specific needs.

Logging in aiohttp

By default, aiohttp logs request and response information using the logging module. This includes details such as the HTTP method, URL, status code, and response size. However, in some cases, we might want more fine-grained control over the logging process. For example, we may want to log additional data like request headers, body, or response headers.

Customizing Request Logging

To customize request logging in aiohttp, we need to use a middleware function. Middleware functions in aiohttp allow us to intercept and modify requests and responses as they pass through the application.

Here’s an example of how to create a custom middleware to log request headers, method, URL, and body:

import logging

async def custom_request_logger(app, handler):
    async def middleware(request):
        logger = logging.getLogger('aiohttp.custom_request')
        logger.info(f"Request URL: {request.url}")
        logger.info(f"Request Method: {request.method}")
        logger.info(f"Request Headers: {request.headers}")

        # Read the request body
        body = await request.text()
        logger.info(f"Request Body: {body}")

        response = await handler(request)

        return response

    return middleware

In this middleware function, we create a logger with the name aiohttp.custom_request. We then log the request details such as the URL, method, and headers. Finally, we read the request body and log it as well.

To add this middleware to your aiohttp application, you can use the app.middlewares.append() method:

from aiohttp import web

app = web.Application()
app.middlewares.append(custom_request_logger)

Now, every time a request is made to your aiohttp application, the custom middleware will log the request details.

Customizing Response Logging

Similar to request logging, we can also customize response logging by creating a custom middleware. Here’s an example of a middleware function that logs the response status code and headers:

import logging

async def custom_response_logger(app, handler):
    async def middleware(request):
        response = await handler(request)
        
        logger = logging.getLogger('aiohttp.custom_response')
        logger.info(f"Response Status: {response.status}")
        logger.info(f"Response Headers: {response.headers}")
        
        return response

    return middleware

In this example, we create a logger with the name aiohttp.custom_response. After the response is obtained from the handler, we log the response status code and headers.

To add this middleware to your aiohttp application, you can use the app.middlewares.append() method as shown earlier.

Conclusion

Customizing request and response logging in aiohttp allows us to gain more control over the logging process and log additional information that may be useful for debugging or monitoring purposes. By creating custom middlewares, we can easily add or remove logging features according to our requirements.

Logging is an essential aspect of web development, and aiohttp provides the flexibility to customize it to our liking. With these customizations, we can have more detailed insights into our aiohttp applications and troubleshoot any issues more effectively.