默认情况下,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为名称的新文件,并记录您想要的任何内容。