芹菜记录协助

Adi*_*tel 7 python logging celery

所以 Celery 是一个超级棒的库,但它的日志记录部分的文档不是最好的,这让我来这里寻求帮助。

我现在的脚本是这样的(总结一下):

import logging
from celery import Celery
from celery.utils.log import get_logger
from task import process
import config

logger = get_logger(__name__)
timber_handler = timber.TimberHandler(api_key=config.key,
                                  level=logging.INFO)
logger.addHandler(timber_handler)



app = Celery('task',
             broker=config.url,
             backend='rpc://')

@app.task
def run_task():
    status = get_status() # get alive or dead status
    if status == 1:
        logger.info("Task is running")
        process()


@app.on_after_configure.connect
def task_periodic(**kwargs):
    app.add_periodic_task(2.0, run_task.s(), name="Run Constantly")
    # More tasks
Run Code Online (Sandbox Code Playgroud)

tasks.py 文件中的 process 函数是非常基本的函数,用于访问 API 和 DB 来获取一些信息,我希望能够将其记录到记录器(timber.io),该记录器附加到 python 日志记录库,并且是一个在线存储对于日志。

然而,我的主要问题是日志被发送到标准输出而不是木材日志。我看过 celery.signals 但文档不是很好。如有任何帮助,我们将不胜感激。谢谢。

Bjo*_*iel 5

你能试试这个吗?

\n\n
import logging\nimport os\nimport sys\nfrom celery import Celery\nfrom celery.signals import after_setup_logger\n\napp = Celery(\'app\')\napp.conf.update({\n    \'broker_url\': \'filesystem://\',\n    \'broker_transport_options\': {\n        \'data_folder_in\': \'./broker/out\',\n        \'data_folder_out\': \'./broker/out\',\n        \'data_folder_processed\': \'./broker/processed\'\n    },\n    \'result_persistent\': False,\n    \'task_serializer\': \'json\',\n    \'result_serializer\': \'json\',\n    \'accept_content\': [\'json\']})\n\n\nlogger = logging.getLogger(__name__)\n\n\nfor f in [\'./broker/out\', \'./broker/processed\']:\n    if not os.path.exists(f):\n        os.makedirs(f)\n\n@after_setup_logger.connect\ndef setup_loggers(logger, *args, **kwargs):\n    formatter = logging.Formatter(\'%(asctime)s - %(name)s - %(levelname)s - %(message)s\')\n\n    # add filehandler\n    fh = logging.FileHandler(\'logs.log\')\n    fh.setLevel(logging.DEBUG)\n    fh.setFormatter(formatter)\n    logger.addHandler(fh)\n\n\n@app.task()\ndef add(x, y):\n    logger.info(\'Found addition\')\n    logger.info(\'Added {0} and {1} to result, \'.format(x,y))\n    return x+y\n\n\nif __name__ == \'__main__\':\n    task = add.s(x=2, y=3).delay()\n
Run Code Online (Sandbox Code Playgroud)\n\n

像这样启动工人:

\n\n
celery worker --app=app.app --concurrency=1 --loglevel=INFO\n
Run Code Online (Sandbox Code Playgroud)\n\n

并异步启动任务:

\n\n
python app.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经对其进行了更改,因此它是一个独立的脚本,仅使用文件系统作为消息代理(另外,我特意用文件处理程序替换了 wood.io 处理程序)。

\n\n

这会将日志写入logs.log(将文件处理程序替换为 wood.io 处理程序,这应该可以解决您的问题)。

\n\n

我遇到了一些困难,因为我无法让它worker_hijack_root_logger=Falsesetup_logging.

\n\n

然而,在重新访问文档后,我得出的结论是,不覆盖记录器而只是增强它是一个更好的选择:

\n\n
\n

如果您\xe2\x80\x99d 喜欢通过 Celery\n 增强日志记录配置设置,那么您可以使用 after_setup_logger 和 after_setup_task_logger\n 信号。

\n
\n\n

另请参阅:http ://docs.celeryproject.org/en/latest/userguide/signals.html#after-setup-logger

\n

  • 你不需要。您为任务所做的事情是:“from celery.utils.log import get_task_logger logger = get_task_logger(__name__)”,然后在任务中使用“logger” (2认同)