如何使用 aiohttp 网络服务器设置日志记录

How to setup logging using aiohttp web server

我有一个网络服务器,我希望能够记录请求、响应和花费的时间。

我遇到了这个 https://docs.aiohttp.org/en/stable/logging.html 但是当我尝试使用 drop in replacement logging AccessLogger class 时。它因以下错误而失败:

Traceback (most recent call last): File "/home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_log.py", line 233, in log self.logger.info(self._log_format % tuple(values), extra=extra) AttributeError: type object 'AccessLogger' has no attribute 'info'

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 472, in start self.log_access(request, resp, loop.time() - now) File "/home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 348, in log_access self.access_logger.log(request, response, time) File "/home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_log.py", line 235, in log self.logger.exception("Error in logging") AttributeError: type object 'AccessLogger' has no attribute 'exception' ERROR:aiohttp.server:Unhandled exception Traceback (most recent call last): File "/home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_log.py", line 233, in log self.logger.info(self._log_format % tuple(values), extra=extra) AttributeError: type object 'AccessLogger' has no attribute 'info'

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 472, in start self.log_access(request, resp, loop.time() - now) File "/home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 348, in log_access self.access_logger.log(request, response, time) File "/home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_log.py", line 235, in log self.logger.exception("Error in logging")

logger.py

from aiohttp.abc import AbstractAccessLogger
class AccessLogger(AbstractAccessLogger):

    def log(self, request, response, time):
        self.logger.info(f'{request.remote} '
                         f'"{request.method} {request.path} '
                         f'done in {time}s: {response.status}')

server.py

from aiohttp import web
from src.api import API
from src.logger import AccessLogger

server = API()
web.run_app(server.app,access_log=AccessLogger)

我的最终目标是也以字典 json 格式记录日志。如果有什么方法可以实现,请告诉我。

您使用了错误的属性。您必须将自定义记录器作为 access_log_class 传递。 (https://docs.aiohttp.org/en/stable/web_reference.html#aiohttp.web.run_app)

from aiohttp import web
from src.api import API
from src.logger import AccessLogger

server = API()
web.run_app(server.app, access_log_class=AccessLogger)

access_log 必须是 logging.Logger 实例