Gunicorn与Flask logger合并,解决apply_async异步无法获得日志的问题

1.使用blueprint下合并gunicorn 和logger日志

项目根目录下增加 gunicorn.conf.py文件

import multiprocessing

bind = "127.0.0.1:5000"
# 监听队列
backlog = 512
# worker_class = 'gunicorn.workers.ggevent.GeventWorker'
workers = multiprocessing.cpu_count() * 2 + 1
# 设置日志级别
loglevel = "debug"
# 设置gunicorn访问日志格式,错误日志无法设置
access_log_format = (
    '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"')
accesslog = '/var/log/gunicorn/gunicorn.access.log'
errorlog = "/var/log/gunicorn/gunicorn.error.log"

proc_name = 'gunicorn.proc'

在项目启动的app.py文件中,create_app()方法中增加

    # log
    gunicorn_logger = logging.getLogger('gunicorn.error')
    app.logger.handlers = gunicorn_logger.handlers
    app.logger.setLevel(gunicorn_logger.level)

即可实现logger与gunicorn的errorlog合并

2.apply_async异步日志合并

def start_stock_job():
	pool = ThreadPool(processes=1)
	app = current_app._get_current_object()
	pool.apply_async(get_stock_data, (app,))
	current_app.logger.info("Main Job Started!")
	return json.dumps({
        'code': 200,
        'data': 'success'
    })

主线程中使用 current_app.logger.info()打印日志。
使用 current_app 获得当前app,并且作为参数推送给异步执行方法

def get_stock_data(newapp):
    with newapp.app_context():
        current_logger = newapp.logger
    curren_logger.info("Child Job Started!")

在异步方法中,采用上下文方式,获得app,使用同样的 app.logger.info 方法进行日志打印。

具体的原理,建议参考以下blog
Python3关于current_app传递给子线程, 作者:coreki

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值