Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

implementing AbstractAsyncAccessLogger #3767

Merged
merged 5 commits into from
May 23, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions aiohttp/abc.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,3 +206,18 @@ def log(self,
response: StreamResponse,
time: float) -> None:
"""Emit log to logger."""


class AbstractAsyncAccessLogger(ABC):
"""Abstract async writer to access log."""

def __init__(self, logger: logging.Logger, log_format: str) -> None:
samuelcolvin marked this conversation as resolved.
Show resolved Hide resolved
self.logger = logger
self.log_format = log_format

@abstractmethod
async def log(self,
request: BaseRequest,
response: StreamResponse,
request_start: float) -> None:
"""Emit log to logger."""
48 changes: 37 additions & 11 deletions aiohttp/web_protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@

import yarl

from .abc import AbstractAccessLogger, AbstractStreamWriter
from .abc import (
AbstractAccessLogger,
AbstractAsyncAccessLogger,
AbstractStreamWriter,
)
from .base_protocol import BaseProtocol
from .helpers import CeilTimeout, current_task
from .http import (
Expand Down Expand Up @@ -65,6 +69,25 @@ class PayloadAccessError(Exception):
"""Payload was accessed after response was sent."""


class AccessLoggerWrapper(AbstractAsyncAccessLogger):
"""
Wraps an AbstractAccessLogger so it behaves
like an AbstractAsyncAccessLogger.
"""
def __init__(self, access_logger: AbstractAccessLogger):
self.access_logger = access_logger
super().__init__(
self.access_logger.logger,
self.access_logger.log_format,
)

async def log(self,
request: BaseRequest,
response: StreamResponse,
request_start: float) -> None:
self.access_logger.log(request, response, request_start)


class RequestHandler(BaseProtocol):
"""HTTP protocol implementation.

Expand Down Expand Up @@ -164,8 +187,11 @@ def __init__(self, manager: 'Server', *,
self.debug = debug
self.access_log = access_log
if access_log:
self.access_logger = access_log_class(
access_log, access_log_format) # type: Optional[AbstractAccessLogger] # noqa
access_logger = access_log_class(access_log, access_log_format)
if isinstance(access_logger, AbstractAsyncAccessLogger):
self.access_logger = access_logger # type: Optional[AbstractAsyncAccessLogger] # noqa
else:
self.access_logger = AccessLoggerWrapper(access_logger)
else:
self.access_logger = None

Expand Down Expand Up @@ -339,13 +365,13 @@ def force_close(self) -> None:
self.transport.close()
self.transport = None

def log_access(self,
request: BaseRequest,
response: StreamResponse,
request_start: float) -> None:
async def log_access(self,
request: BaseRequest,
response: StreamResponse,
request_start: float) -> None:
if self.access_logger is not None:
self.access_logger.log(request, response,
self._loop.time() - request_start)
await self.access_logger.log(request, response,
self._loop.time() - request_start)

def log_debug(self, *args: Any, **kw: Any) -> None:
if self.debug:
Expand Down Expand Up @@ -526,10 +552,10 @@ async def finish_response(self,
await prepare_meth(request)
await resp.write_eof()
except ConnectionResetError:
self.log_access(request, resp, start_time)
await self.log_access(request, resp, start_time)
return True
else:
self.log_access(request, resp, start_time)
await self.log_access(request, resp, start_time)
return False

def handle_error(self,
Expand Down