![](/img/trans.png)
[英]How to programmatically tell Celery to send all log messages to stdout or stderr?
[英]Send log messages from all celery tasks to a single file
我想知道如何設置更具體的日志記錄系統。 我所有的任務都使用
logger = logging.getLogger(__name__)
作為模塊范圍的記錄器。
我希望 celery 記錄到“celeryd.log”並將我的任務記錄到“tasks.log”,但我不知道如何讓它工作。 使用 django-celery 中的CELERYD_LOG_FILE
我可以將所有與 celeryd 相關的日志消息路由到 celeryd.log,但是我的任務中創建的日志消息沒有任何痕跡。
注意:從 Celery 3.0 開始,此答案已過時,您現在使用get_task_logger()
來設置每個任務的記錄器。 有關詳細信息,請參閱Celery 3.0 文檔中的新增功能的日志記錄部分。
Celery 專門支持每個任務的日志記錄。 請參閱有關該主題的任務文檔:
您可以使用工作日志記錄器將診斷 output 添加到工作日志:
@celery.task() def add(x, y): logger = add.get_logger() logger.info("Adding %s + %s" % (x, y)) return x + y
有幾個日志級別可用,worker loglevel 設置決定是否將它們寫入日志文件。
當然,您也可以簡單地使用 print,因為寫入標准輸出/-err 的任何內容也將寫入日志文件。
在引擎蓋下,這仍然是標准的 python 日志記錄模塊。 您可以將CELERYD_HIJACK_ROOT_LOGGER
選項設置為 False 以允許您自己的日志記錄設置工作,否則 Celery 將為您配置處理。
但是,對於任務, .get_logger()
調用確實允許您為每個單獨的任務設置單獨的日志文件。 只需傳入一個logfile
參數,它就會將日志消息路由到該單獨的文件:
@celery.task()
def add(x, y):
logger = add.get_logger(logfile='tasks.log')
logger.info("Adding %s + %s" % (x, y))
return x + y
最后但同樣重要的是,您可以在python 日志記錄模塊中配置您的頂級 package 並為其提供自己的文件處理程序。 我將使用celery.signals.after_setup_task_logger
信號進行設置; 在這里,我假設您的所有模塊都位於名為foo.tasks
的 package 中(如foo.tasks.email
和foo.tasks.scaling
):
from celery.signals import after_setup_task_logger
import logging
def foo_tasks_setup_logging(**kw):
logger = logging.getLogger('foo.tasks')
if not logger.handlers:
handler = logging.FileHandler('tasks.log')
formatter = logging.Formatter(logging.BASIC_FORMAT) # you may want to customize this.
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.propagate = False
after_setup_task_logger.connect(foo_tasks_setup_logging)
現在,任何名稱以foo.tasks
開頭的記錄器都會將其所有消息發送到tasks.log
而不是根記錄器(因為.propagate
為 False,根記錄器看不到任何這些消息)。
只是一個提示:Celery 有自己的日志處理程序:
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
此外,Celery 從任務中記錄所有 output。 Celery 文檔中有關任務日志記錄的更多詳細信息
加入--concurrency=1 --loglevel=INFO
與命令運行 celery worker
例如: python xxxx.py celery worker --concurrency=1 --loglevel=INFO
最好在每個 python 文件中設置日志級別
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.