默认情况下,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方法时,日志记录不存储在任何地方。
答案 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的新文件,并记录您想要的任何内容。