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

问题描述

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

我遇到了这个https://docs.aiohttp.org/en/stable/logging.html,但是当我尝试使用替换日志记录AccessLogger类中的内容时。它失败并显示以下错误

回溯(最近通话最近): 日志中的文件“ /home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_log.py”,第233行 self.logger.info(self._log_format%元组(值),extra = extra) AttributeError:类型对象“ AccessLogger”没有属性“ info”

在处理上述异常期间,发生了另一个异常:

回溯(最近通话最近): 开始时,文件“ /home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_protocol.py” self.log_access(request,resp,loop.time()-现在) 在log_access中的第348行,文件“ /home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_protocol.py” self.access_logger.log(请求,响应,时间) 在日志中的文件“ /home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_log.py”,第235行 self.logger.exception(“记录错误”) AttributeError:类型对象“ AccessLogger”没有属性“ exception” 错误:aiohttp.server:未处理的异常 追溯(最近一次通话): 日志中的文件“ /home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_log.py”,第233行 self.logger.info(self._log_format%元组(值),extra = extra) AttributeError:类型对象“ AccessLogger”没有属性“ info”

在处理上述异常期间,发生了另一个异常:

回溯(最近通话最近): 开始时,文件“ /home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_protocol.py” self.log_access(request,resp,loop.time()-现在) 在log_access中的第348行,文件“ /home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_protocol.py” self.access_logger.log(请求,响应,时间) 在日志中的文件“ /home/kay/.local/share/virtualenvs/entity-extractor-BuK_iA9e/lib/python3.8/site-packages/aiohttp/web_log.py”,第235行 self.logger.exception(“记录错误”)

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实例

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...