Python Celery-如何分离日志文件



默认情况下,python-芹菜包会集中日志。在我的设计规范中,我希望将每个工作人员的日志写入一个单独的文件,其中文件名将与发送给任务的唯一ID相匹配。集中式日志显示日志来自哪个工作人员,但我不知道如何将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=错误

主.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方法时,日志不会存储在任何地方。

您必须首先禁用芹菜日志记录。你可以通过设置来做到这一点

CELERYD_HIJACK_ROOT_LOGGER = False 

在您的配置中,或者您可以使用Celery信号。

现在,如果你管理你的员工,你不会看到任何信息。

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

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

对于每个任务,这都会创建一个以任务id为名称的新文件,并记录您想要的任何内容。

相关内容

  • 没有找到相关文章

最新更新