gunicorn & Flask 自定义日志

3,250 阅读1分钟

目标

通过gunicorn启动app后可以将info、error等事件写入日志文件,带有错误所在模块-函数-行数

log_config.py

from gunicorn import glogging
import logging

class CustomLogger(glogging.Logger):
    """Custom logger for Gunicorn log messages."""

    def setup(self, cfg):
        """Configure Gunicorn application logging configuration."""
        super().setup(cfg)

        # Override Gunicorn's `error_log` configuration.
        self._set_handler(
            self.error_log, cfg.errorlog, logging.Formatter(
                fmt=('timestamp=%(asctime)s pid=%(process)d '
                     'loglevel=%(levelname)s code=%(filename)s-%(funcName)s-%(lineno)s '
					 'msg=%(message)s')))

app.py

......
if __name__ == '__main__':
	app.run(host='0.0.0.0', port=5000, debug=True,threaded=True)
	

if __name__ != '__main__':
	gunicorn_logger = logging.getLogger('gunicorn.error')
	app.logger.handlers = gunicorn_logger.handlers
	app.logger.setLevel('INFO')  #<<-特别注意,否则info级别不能打印

启动指令

更换·logger_class·默认的gunicorn.glogging.Logger为自定义日志类

gunicorn --logger-class log_config.CustomLogger" -c deploy_config.py run:app

疑惑?

在app.py中写入日志配置类启动,会发现只有一个进程被“真正启动”。flask_sqlalchemy在各个线程创建的db都指向同一地址,不能worker间数据库连接的分离??再去研究下