启用gunicorn之后,日志写不到文件的问题


#1

在书的第14章,部署到Linux服务器一节,我按照书上的步骤部署bluelog程序,但启用gunicorn之后,日志不能写到文件中。

我的register_logging()方法是这样的:
bluelog/init.py:

def register_logging(app):
    app.logger.setLevel(logging.INFO)

    file_handler = RotatingFileHandler(os.path.join(basedir, 'logs/bluelog.log'),
                                       maxBytes=10 * 1024 * 1024, backupCount=10)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    file_handler.setFormatter(formatter)
    file_handler.setLevel(logging.INFO)

    mail_handler = SMTPHandler(
        mailhost=app.config['MAIL_SERVER'],
        fromaddr=app.config['MAIL_USERNAME'],
        toaddrs=['ADMIN_EMAIL'],
        subject='Bluelog Application Error',
        credentials=(app.config['MAIL_USERNAME'], app.config['MAIL_PASSWORD']))

    class RequestFormatter(logging.Formatter):

        def format(self, record):
            record.url = request.url
            record.remote_addr = request.remote_addr
            return super(RequestFormatter, self).format(record)

    request_formatter = RequestFormatter(
        '[%(asctime)s] %(remote_addr)s requested %(url)s\n'
        '%(levelname)s in %(module)s: %(message)s'
    )

    mail_handler.setLevel(logging.ERROR)
    mail_handler.setFormatter(request_formatter)

    if not app.debug:
        app.logger.addHandler(file_handler)
        app.logger.addHandler(mail_handler)

gunicorn启动时的命令是这样的:
···
$ gunicorn --workers=4 --bind=0.0.0.0:8000 wsgi:app
[2019-07-04 09:41:38 +0800] [14741] [INFO] Starting gunicorn 19.9.0
[2019-07-04 09:41:38 +0800] [14741] [INFO] Listening at: http://0.0.0.0:8000 (14741)
[2019-07-04 09:41:38 +0800] [14741] [INFO] Using worker: sync
[2019-07-04 09:41:38 +0800] [14744] [INFO] Booting worker with pid: 14744
[2019-07-04 09:41:38 +0800] [14745] [INFO] Booting worker with pid: 14745
[2019-07-04 09:41:38 +0800] [14747] [INFO] Booting worker with pid: 14747
[2019-07-04 09:41:38 +0800] [14749] [INFO] Booting worker with pid: 14749
···
日志直接打印到了终端上。

我在网上找了些文章,上面提到了一个问题,就是gunicorn有自己的日志,所以没有写到Flask的日志里面,然后我又在register_logging()方法上增加了一些内容,来修复这个问题,但问题依然没有解决,下面是增加的内容:

def register_logging(app):
    gunicorn_logger = logging.getLogger('gunicorn.error')
    app.logger.handlers = gunicorn_logger.handlers
    app.logger.setLevel(gunicorn_logger.level)

    ...

抑或是这种情况:

def register_logging(app):
    gunicorn_logger = logging.getLogger('gunicorn.error')
    app.logger.handlers.extend(gunicorn_logger.handlers)
    app.logger.setLevel(logging.INFO)

    ...

还是不能把日志写入到文件中,或者只写入了少量的gunicorn日志,跟开发阶段输出的日志完全不一样。

日志问题困扰了我很长时间。部署到生产环境没有日志的话非常不方便,不知道各位是否遇到了这样的问题,如果有的话还请帮忙指点一下。