芹菜采伐协助

时间:2018-08-29 21:37:56

标签: 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

tasks.py文件中的process函数是非常基本的函数,用于查找API和DB的某些信息,我希望能够将其记录到附加到python日志记录库的logger(timber.io)中,并且日志的在线存储。

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

1 个答案:

答案 0 :(得分: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

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

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

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

但是,在回顾了文档之后,我得出一个结论,那就是不重写记录器,而只是增加记录器是一个更好的选择:

  

如果您想扩充Celery的日志记录配置设置   那么您可以使用after_setup_logger和after_setup_task_logger   信号。

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