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)

用supervisord运行芹菜无法发现任务

supervisord部署多项目

如何以编程方式告诉 Celery 将所有日志消息发送到标准输出或标准错误?

在supervisord中设置环境变量时出现Python键错误