【问题标题】:Assistance with Celery Logging协助芹菜伐木
【发布时间】:2018-08-29 21:37:56
【问题描述】:

所以 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

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

但是,我的主要问题是原木被发送到标准输出而不是原木原木。我看过 celery.signals 但文档不是很好。这里的任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: python logging celery


    【解决方案1】:

    你可以试试这个吗?

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

    像这样启动工人:

    celery worker --app=app.app --concurrency=1 --loglevel=INFO
    

    并异步启动任务:

    python app.py
    

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

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

    我遇到了一些困难,因为我无法使用worker_hijack_root_logger=False 和setup_logging 中定义的自定义记录器。

    但是,在重新访问文档后,我得出的结论是,最好不要覆盖记录器,而只是增加它:

    如果您想增加 Celery 的日志记录配置设置 然后你可以使用 after_setup_logger 和 after_setup_task_logger 信号。

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

    【讨论】:

    • 当然,我有一个简单的问题。如何将该记录器传递给 run_task() 方法?
    • 你不需要。你为你的任务做什么,是这样的:from celery.utils.log import get_task_logger logger = get_task_logger(__name__) 然后在你的任务中使用logger
    • 我只是我写的测试但我没有得到日志,我做错了什么吗?此外,Timber.io 非常新,可能不支持 celery 记录器,这可能是一种情况
    猜你喜欢
    • 2016-01-26
    • 2023-03-27
    • 2012-03-07
    • 2012-03-06
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多