簡體   English   中英

將所有 celery 任務的日志消息發送到單個文件

[英]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.emailfoo.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM