我们在Python应用程序中使用芹菜来管理任务。
我们还将Django structlog
用于芹菜打印的日志消息。
我们通过Logstash将这些消息摄取到ElasticSearch,并注意到我们收到的绝大多数消息是以下2条:
接收任务:%s 任务%(名称)%(Id)在%(运行时)ss:%(return_value)s中成功
芹菜用信息日志记录级别将它们转储。
是否有任何方法将这些消息更改为调试级别?
这样我们仍然可以使用-l INFO
运行芹菜并查看其他信息消息,而不是这些消息?
更新
第二次日志留言。
快速阅读后:
不了解芹菜,Django和structlog,类似的东西会起作用吗?
LOGGING = {
...
'loggers': {
'celery.app.trace': {
'handlers': ['null'],
'propagate': False,
}
...
}
发布于 2020-04-21 14:38:58
我只能忽略这两条信息:
init.py
import celery
from unittest import mock
app = celery.Celery()
from celery.app import trace
old_info = trace.info
trace.info = mock.Mock()
class MyTask(celery.Task):
Strategy = '61242484.strategy:my_default'
@app.task(base=MyTask)
def test():
print("123")
test.apply_async()
strategy.py
from unittest import mock
from celery.worker.strategy import default
def my_default(*args, **kwargs):
kwargs['info'] = mock.Mock()
return default(*args, **kwargs)
发布于 2022-10-15 22:36:13
@安东·波米舍琴科,谢谢你的帮助,这对我非常有用。但是,我在my_default
方法中发现了一个错误
在这方面:
def strategy(*args, **kwargs):
kwargs['info'] = mock.Mock()
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
logger.info(f'test: {list(args)}')
logger.info(f'test: {[type(arg) for arg in list(args)]}')
return celery.worker.strategy.default(*args, **kwargs)
我明白了:
INFO 2022-10-16 00:19:40,673 celery_app 41 139675281467200 test: [<@task: add_test_iterator of napsedjango at 0x7f08ac73f610>, <@task: add_test_iterator of napsedjango at 0x7f08ac73f610>, <Celery napsedjango at 0x7f08ac73f610>, <Consumer: celery@06d4f16e55fb (running)>]
INFO 2022-10-16 00:19:40,674 celery_app 41 139675281467200 test: [<class 'napsedjango._users.tasks.add_test_iterator'>, <class 'napsedjango._users.tasks.add_test_iterator'>, <class 'celery.app.base.Celery'>, <class 'celery.worker.consumer.consumer.Consumer'>]
CRITICAL 2022-10-16 00:19:40,674 worker 41 139675281467200 Unrecoverable error: TypeError("default() got multiple values for argument 'info'")
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/celery/worker/worker.py", line 203, in start
self.blueprint.start(self)
File "/usr/local/lib/python3.10/site-packages/celery/bootsteps.py", line 116, in start
step.start(parent)
File "/usr/local/lib/python3.10/site-packages/celery/bootsteps.py", line 365, in start
return self.obj.start()
File "/usr/local/lib/python3.10/site-packages/celery/worker/consumer/consumer.py", line 332, in start
blueprint.start(self)
File "/usr/local/lib/python3.10/site-packages/celery/bootsteps.py", line 116, in start
step.start(parent)
File "/usr/local/lib/python3.10/site-packages/celery/worker/consumer/tasks.py", line 26, in start
c.update_strategies()
File "/usr/local/lib/python3.10/site-packages/celery/worker/consumer/consumer.py", line 561, in update_strategies
self.strategies[name] = task.start_strategy(self.app, self)
File "/usr/local/lib/python3.10/site-packages/celery/app/task.py", line 412, in start_strategy
return instantiate(self.Strategy, self, app, consumer, **kwargs)
File "/usr/local/lib/python3.10/site-packages/celery/utils/imports.py", line 49, in instantiate
return symbol_by_name(name)(*args, **kwargs)
File "/app/config/celery_app.py", line 44, in strategy
return celery.worker.strategy.default(*args, **kwargs)
TypeError: default() got multiple values for argument 'info'
在第1行和第2行(记录器)上,我们可以看到在args
中有2次任务。这与celery.worker.strategy.default()的条目不对应。
要解决这个问题:
def strategy(*args, **kwargs):
kwargs['info'] = mock.Mock()
return celery.worker.strategy.default(*args[1:], **kwargs)
https://stackoverflow.com/questions/61345350
复制相似问题