我正在使用Supervisor来管理芹菜。芹菜的管理器配置文件包含以下2个条目:
stdout_logfile = /var/log/supervisor/celery.log
stderr_logfile = /var/log/supervisor/celery_err.log
让我困惑的是,尽管芹菜工作正常,所有任务都成功完成,但它们都被写入celery_error .log。我以为那只适用于错误。log文件只显示正常的芹菜启动信息。将任务成功完成写入错误日志的行为是否正确?
注释 -任务绝对成功完成(电子邮件正在发送,数据库条目制作等)。
我遇到过和你一样的现象。这是因为芹菜的日志机制。查看芹菜记录器源代码的setup_task_loggers方法。
如果不指定
logfile
,则使用sys.stderr
。
那么,清楚了吗?芹菜使用sys。当未指定日志文件时,会发生错误。
解决方案:
- 您可以使用superord redirect_stderr = true标志将两个日志文件合并为一个。我用的是这个。
- 配置芹菜日志文件选项
将任务成功完成写入错误日志的行为是否正确?
不,不是的。我有相同的设置和日志记录工作正常。
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_error .log有一些警告/错误。
您可能遇到的一个问题是python默认缓冲输出
在你的supervisor文件中,你可以通过设置PYTHONUNBUFFERED环境变量来禁用它,见下面我的Django示例supervisor文件
[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