Python Celery - 如何分隔日志文件

时间:2015-04-18 04:36:39

标签: python celery

默认情况下,python芹菜包会集中日志。 在我的设计规范中,我希望将每个worker的日志写入一个单独的文件,其中文件名将匹配发送给任务的唯一ID。 Centrilized日志显示日志来自哪个工作人员,但我无法弄清楚如何将id映射到工作人员编号。

为了分散日志,我尝试了:

import logging
CELERYD_HIJACK_ROOT_LOGGER = False
app = Celery()
@app.task
def my_task(id):
    logging.basicConfig(filename='/tmp/%i.log' % id)
    my_package.do_somthing()
    logging.info('hi')

但这不是创建任何日志文件。 有没有办法分离日志或将工作人员编号映射到ID的方法,以便我可以生成单独的日志?


更新

阅读http://docs.celeryproject.org/en/latest/userguide/tasks.html#names 我尝试过这种方法仍然无法制作单独的日志:

celeryconfig.py:

CELERYD_HIJACK_ROOT_LOGGER = False

main.py

import logging
app = Celery()
app.config_from_object('celeryconfig')
@app.task(bind=True)
def my_task(self, id):
    self.request.logfile = '/tmp/%i.log' % id
    my_package.do_somthing()
    logging.info('hi')

另外,我发现了一个博客:http://echorand.me/2012/08/14/celery-and-python-logging/ 并试了一下。它只会将日志消息“hi”写入单独的文件,但会继续从

发送日志
my_package.do_somthing()

到标准输出意味着记录器没有全局修复,并且在记录器周围传递将变得非常混乱,因此不会这样做。


更新

我尝试了博客中的代码: https://github.com/kouroshparsa/celery_separate_logging/tree/master/celery_example

调用mylib / fire.py:burn方法时,日志记录不存储在任何地方。

1 个答案:

答案 0 :(得分:2)

您必须先禁用芹菜日志记录。你可以通过设置

来做到这一点
 CELERYD_HIJACK_ROOT_LOGGER = False 
在您的配置中

,或者您可以使用Celery signals

现在如果你经营你的工人,你将看不到任何信息。

让我们写一个简单的记录器,将事物记录到单独的文件

def custom_logger(name):
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    handler = logging.FileHandler(os.path.join('/tmp/', name + '.log'), 'w')
    logger.addHandler(handler)
    return logger


@app.task()
def add(x, y):

    task_id = add.request.id
    l = custom_logger(task_id)
    l.info("Testing Log")

    return x + y

对于每个任务,这将创建一个名为task name的新文件,并记录您想要的任何内容。