2016-08-22 90 views
2

aiohttp很棒,但使用Gunicorn时,设置日志记录一直是一个噩梦,无论是在本地还是在生产中。在Gunicorn使用aiohttp和aiopg时如何设置日志记录?

大多数实例和文档我找到设置日志记录是在本机服务器模式下运行,在您使用make_handler()

如文档中推荐的,我使用Gunicorn作为Web服务器来部署,所以我不明确地打电话给make_handler

我没有看到aiohttp.access日志,也不是aiohttp.server日志,也不是aiopg记录,所有这些都应该被默认设置

这是我的根已经有了app.py级别:

import logging 

import aiopg 
from aiohttp import web 

async def some_handler(request): 
    id = request.match_info["id"] 
    # perform some SA query 
    return web.json_response({"foo": id}) 

async def close_postgres(app): 
    app['postgres'].close() 
    await app['postgres'].wait_closed 

async def init(loop, logger, config): 
    app = web.Application(
     loop=loop, 
     logger=logger 
    ) 

    app['postgres'] = await aiopg.sa.create_engine(loop=loop, echo=True) # other args ommitted 
    app.on_cleanup.append(close_postgres) 

    app.router.add_route('GET', '/', some_handler, 'name') 

    return app 

def run(): 
    config = parse_yaml('config.yml') # => turns config.yml to dict 
    logging.config.dictConfig(config['logging']) 
    logger = logging.getLogger("api") 

    loop = asyncio.get_event_loop() 
    app = run_until_complete(init(loop, logger, config)) 

    return app 

我config.yml文件

logging: 
    version: 1 
    formatters: 
    simple: 
     format: '[%(asctime)s] [%(process)d] [%(levelname)s] %(message)s' 
     datefmt: '%Y-%m-%d %H:%M:%S %z' 
    handlers: 
    console: 
     class: logging.StreamHandler 
     formatter: simple 
     level: DEBUG 
     stream: ext://sys.stdout 
    loggers: 
    api: 
     handlers: 
     - console 
     level: DEBUG 

我启动gunicorn有以下几点:

gunicorn 'app:run()' --worker-class aiohttp.worker.GunicornWebWorker 

我只看到以下日志,无论我做什么查询:

[2016-08-22 11:26:46 -0400] [41993] [INFO] Starting gunicorn 19.6.0 
[2016-08-22 11:26:46 -0400] [41993] [INFO] Listening at: http://127.0.0.1:8000 (41993) 
[2016-08-22 11:26:46 -0400] [41993] [INFO] Using worker: aiohttp.worker.GunicornWebWorker 
[2016-08-22 11:26:46 -0400] [41996] [INFO] Booting worker with pid: 41996 

我想要什么:

  • aiopg日志(查询RAN)
  • 访问日志
  • 服务器日志

感谢

回答

2

文档没有最终推荐使用Gunicorn部署,但有说明为Gunicorn下运行。

也许它应该升级到为访问记录器传递正确的格式。

从我的角度来看,运行aiohttp服务器的最简单方法就是运行它(通过使用web.run_app()处理程序或在其上构建自己的运行程序)。

如果您需要几个aiohttp实例 - 在反向代理模式下使用nginx(很可能您已经在您的工具链中拥有它)并使用supervisord控制服务器。

这个组合不需要中间层就可以工作。就像人们开始龙卷风或扭曲一样。

+0

谢谢老板!除了自动重新加载之外,我知道这是一个正在开发的功能,所以我最终将Gunicorn拆除并且一切正常。你是对的,我并不需要它 - 我主要是误导,因为在文档中有一个标题为“使用Gunicorn进行部署”的主要部分。 – jellycola

+0

我是否正确理解aiohttp本机服务器+ nginx是否足以用于生产设置?谢谢 – wolendranh

+0

是的。基本上部署过程与扭曲或龙卷风相同。 –

相关问题