Supervisord / Celery 输出日志
Posted
技术标签:
【中文标题】Supervisord / Celery 输出日志【英文标题】:Supervisord / Celery output logs 【发布时间】:2015-10-11 22:07:02 【问题描述】:我正在使用 Supervisor 来管理 celery。 celery 的主管配置文件包含以下 2 个条目:
stdout_logfile = /var/log/supervisor/celery.log
stderr_logfile = /var/log/supervisor/celery_err.log
让我困惑的是,虽然 Celery 工作正常并且所有任务都成功完成,但它们都写入了 celery_err.log。我认为那只是为了错误。 celery.log 文件只显示正常的 celery 启动信息。将任务成功完成写入错误日志的行为是否正确?
注意 - 任务肯定会成功完成(正在发送电子邮件、创建数据库条目等)。
【问题讨论】:
【参考方案1】:我遇到了和你一样的现象。这是因为 celery 的日志机制。看celery logger source的setup_task_loggers方法就行了。
如果未指定
logfile
,则使用sys.stderr
。
那么,够清楚了吗?未指定日志文件时,Celery 使用 sys.stderr。
解决方案:
-
您可以使用 supervisord redirect_stderr = true 标志将两个日志文件合并为一个。我正在使用这个。
配置 celery 日志文件选项。
【讨论】:
【参考方案2】:将任务成功完成写入错误日志的行为是否正确?
不,不是。我有相同的设置并且日志记录工作正常。
celery.log 有任务信息
[2015-07-23 11:40:07,066: INFO/MainProcess] Received task: foo[b5a6e0e8-1027-4005-b2f6-1ea032c73d34]
[2015-07-23 11:40:07,494: INFO/MainProcess] Task foo[b5a6e0e8-1027-4005-b2f6-1ea032c73d34] succeeded in 0.424549156s: 1
celery_err.log 有一些警告/错误。尝试重新启动主管进程。
【讨论】:
【参考方案3】:您可能遇到的一个问题是默认情况下 python 缓冲区输出
在您的主管文件中,您可以通过设置 PYTHONUNBUFFERED 环境变量来禁用此功能,请参见下面我的 Django 示例主管文件
[program:celery-myapp]
environment=DJANGO_SETTINGS_MODULE="myapp.settings.production",PYTHONUNBUFFERED=1
command=/home/me/.virtualenvs/myapp/bin/celery -A myapp worker -B -l DEBUG
directory=/home/me/www/saleor
user=me
stdout_logfile=/home/me/www/myapp/log/supervisor-celery.log
stderr_logfile=/home/me/www/myapp/log/supervisor-celery-err.log
autostart=true
autorestart=true
startsecs=10
【讨论】:
以上是关于Supervisord / Celery 输出日志的主要内容,如果未能解决你的问题,请参考以下文章
Django Celery Elastic Beanstalk supervisord 没有这样的进程错误
python测试开发django-193.使用supervisord 后台启动celery 服务(worker/beat)