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