【问题标题】:Less Celery task logging更少的 Celery 任务日志记录
【发布时间】:2020-08-04 07:21:33
【问题描述】:

我们使用 Celery 来管理 Python Django 应用程序中的任务。
我们还使用 Django structlog 来记录 Celery 打印的日志消息。
我们通过 Logstash 将这些消息摄取到 ElasticSearch,并注意到我们收到的绝大多数消息是这 2 条:

收到的任务:%s

任务 %(name)s[%(id)s] 在 %(runtime)ss 中成功:%(return_value)s

Celery 使用 INFO 日志记录级别转储它们。
有什么方法可以将这些消息更改为 DEBUG 级别?
这样我们仍然可以使用 -l INFO 运行 celery 并查看其他 INFO 消息,但看不到这些消息?

更新

对于第二条日志消息。

快速阅读后:

如果没有 Celery、Django 和 structlog 的很多知识,这样的东西会起作用吗?

LOGGING = {
...
'loggers': {
        'celery.app.trace': {
          'handlers': ['null'],
          'propagate': False,
         }
...
}

【问题讨论】:

  • 如果您可以发布更多信息,例如您想在 DEBUG 模式下登录哪个特定的 ES 类/包/模块,我们可以为您提供帮助
  • 对不起,如果我不清楚。 DEBUG \ INFO 级别 - 位于 Celery 记录器级别,而不是 ElasticSearch。我想我可以在 Logstash 中过滤它们,但理想情况下我更希望 Celery 根本不打印它们。

标签: elasticsearch celery elastic-stack django-celery


【解决方案1】:

我只能忽略这两条消息:

初始化.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)

【讨论】:

  • 嗨安东。非常感谢您的回复。你有机会解释它是如何工作的吗?我对 Celery 或 structlog 了解不多,所以对我来说有点神秘。
  • 我只是查看了 celery 的来源,并了解了如何避免日志记录。您忽略 celery.app.trace 的解决方案更好。
  • 是的,我最终将那个配置用于 structlog,但还没有完全测试它
猜你喜欢
  • 2013-09-30
  • 2018-09-22
  • 2021-03-29
  • 2014-05-22
  • 2013-02-20
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多