| 34 | |
| 35 | |
| 36 | class MessageLoggerMiddleware: |
| 37 | def __init__(self, app: class="st">"ASGI3Application"): |
| 38 | self.task_counter = 0 |
| 39 | self.app = app |
| 40 | self.logger = logging.getLogger(class="st">"uvicorn.asgi") |
| 41 | |
| 42 | def trace(message: Any, *args: Any, **kwargs: Any) -> None: |
| 43 | self.logger.log(TRACE_LOG_LEVEL, message, *args, **kwargs) |
| 44 | |
| 45 | self.logger.trace = trace class="cm"># type: ignore |
| 46 | |
| 47 | async def __call__( |
| 48 | self, |
| 49 | scope: class="st">"WWWScope", |
| 50 | receive: class="st">"ASGIReceiveCallable", |
| 51 | send: class="st">"ASGISendCallable", |
| 52 | ) -> None: |
| 53 | self.task_counter += 1 |
| 54 | |
| 55 | task_counter = self.task_counter |
| 56 | client = scope.get(class="st">"client") |
| 57 | prefix = class="st">"%s:%d - ASGI" % (client[0], client[1]) if client else class="st">"ASGI" |
| 58 | |
| 59 | async def inner_receive() -> class="st">"ASGIReceiveEvent": |
| 60 | message = await receive() |
| 61 | logged_message = message_with_placeholders(message) |
| 62 | log_text = class="st">"%s [%d] Receive %s" |
| 63 | self.logger.trace( class="cm"># type: ignore |
| 64 | log_text, prefix, task_counter, logged_message |
| 65 | ) |
| 66 | return message |
| 67 | |
| 68 | async def inner_send(message: class="st">"ASGISendEvent") -> None: |
| 69 | logged_message = message_with_placeholders(message) |
| 70 | log_text = class="st">"%s [%d] Send %s" |
| 71 | self.logger.trace( class="cm"># type: ignore |
| 72 | log_text, prefix, task_counter, logged_message |
| 73 | ) |
| 74 | await send(message) |
| 75 | |
| 76 | logged_scope = message_with_placeholders(scope) |
| 77 | log_text = class="st">"%s [%d] Started scope=%s" |
| 78 | self.logger.trace(log_text, prefix, task_counter, logged_scope) class="cm"># type: ignore |
| 79 | try: |
| 80 | await self.app(scope, inner_receive, inner_send) |
| 81 | except BaseException as exc: |
| 82 | log_text = class="st">"%s [%d] Raised exception" |
| 83 | self.logger.trace(log_text, prefix, task_counter) class="cm"># type: ignore |
| 84 | raise exc from None |
| 85 | else: |
| 86 | log_text = class="st">"%s [%d] Completed" |
| 87 | self.logger.trace(log_text, prefix, task_counter) class="cm"># type: ignore |
no outgoing calls