Supervisord / Celery输出日志

时间:2015-07-22 07:11:52

标签: django celery supervisord

我正在使用Supervisor来管理芹菜。 celery的supervisor配置文件包含以下两个条目:

stdout_logfile = /var/log/supervisor/celery.log
stderr_logfile = /var/log/supervisor/celery_err.log

令我困惑的是,虽然Celery工作正常并且所有任务都已成功完成,但它们都写入了celery_err.log。我认为那只会是错误的。 celery.log文件仅显示正常的芹菜启动信息。将成功完成任务的行为写入错误日志是否正确?

注意 - 任务肯定已成功完成(发送电子邮件,制作数据库条目等)。

3 个答案:

答案 0 :(得分:3)

我遇到了和你一样的现象。这是因为芹菜的登录机制。只需查看celery logger source的setup_task_loggers方法。

  

如果未指定logfile,则使用sys.stderr

那么,够清楚吗?当未指定日志文件时,Celery使用sys.stderr。

解决方案:

  1. 您可以使用supervisord redirect_stderr = true标志将两个日志文件合并为一个。我正在使用这个。
  2. 配置celery日志文件选项。

答案 1 :(得分:0)

  

将错误日志写入成功完成任务的行为是否正确?

不,不是。我有相同的设置,日志记录工作正常。

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有一些警告/错误。尝试重新启动主管流程。

答案 2 :(得分:0)

您可能遇到的一个问题是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