当前位置: 首页 > 面试题库 >

将所有celery任务的日志消息发送到单个文件

严承允
2023-03-14
问题内容

我想知道如何设置更具体的日志记录系统。我所有的任务都使用

logger = logging.getLogger(__name__)

作为整个模块的记录器。

我希望celery登录到“ celeryd.log”,而我的任务登录到“
tasks.log”,但我不知道如何使它工作。使用CELERYD_LOG_FILEdjango-
celery可以将所有与celeryd相关的日志消息路由到celeryd.log,但是没有跟踪在我的任务中创建的日志消息。


问题答案:

注意:此答案在Celery
3.0上已经过时,现在您可以在此处使用它get_task_logger()来设置每任务记录器。有关详细信息,请参见“
Celery
3.0的新增功能”文档的“日志记录”部分。

Celery为每个任务提供了专门的日志记录支持。请参阅有关此主题的任务文档:

您可以使用工作日志记录器将诊断输出添加到工作日志:

@celery.task()
def add(x, y):
    logger = add.get_logger()
    logger.info("Adding %s + %s" % (x, y))
    return x + y

有多个日志记录级别可用,并且worker日志级别设置决定是否将它们写入日志文件。

当然,您也可以简单地使用print,因为任何写入标准out / -err的内容也将被写入日志文件。

在后台,这仍然是标准的python日志记录模块。您可以将CELERYD_HIJACK_ROOT_LOGGER选项设置为False,以允许您自己的日志记录设置起作用,否则Celery将为您配置处理方式。

但是,对于任务,.get_logger()调用确实允许您为每个单独的任务设置单独的日志html" target="_blank">文件。只需传入一个logfile参数,它将日志消息路由到该单独的文件:

@celery.task()
def add(x, y):
    logger = add.get_logger(logfile='tasks.log')
    logger.info("Adding %s + %s" % (x, y))
    return x + y

最后但并非最不重要的一点是,您可以在python日志记录模块中配置顶级程序包,并为其提供自己的文件处理程序。我将使用celery.signals.after_setup_task_logger信号进行设置;在这里,我假设您所有的模块都生活在一个名为foo.tasks(如foo.tasks.email和中foo.tasks.scaling)的包中:

from celery.signals import after_setup_task_logger
import logging

def foo_tasks_setup_logging(**kw):
    logger = logging.getLogger('foo.tasks')
    if not logger.handlers:
        handler = logging.FileHandler('tasks.log')
        formatter = logging.Formatter(logging.BASIC_FORMAT) # you may want to customize this.
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.propagate = False

after_setup_task_logger.connect(foo_tasks_setup_logging)

现在,任何以名字开头的记录器foo.tasks都将发送其所有消息,tasks.log而不是发送到根记录器(由于.propagateFalse
,它不会看到任何这些消息)。



 类似资料:
  • 问题内容: 我需要推迟发送频道消息。这是我的代码: 该任务正在执行,我看不到任何错误,但消息未发送。仅当我从消费者类方法发送时才有效。 我也尝试使用AsyncWebsocketConsumer并使用AsyncToSync(layer.group_send)发送。错误为“您不能在与异步事件循环相同的线程中使用AsyncToSync- 请直接等待异步功能。” 然后,我尝试将send_message_t

  • 问题内容: python的日志记录模块是否有一种简单的方法可以将具有DEBUG或INFO级别的消息以及具有更高级别的消息发送到不同的流? 反正这是个好主意吗? 问题答案: 不一定是一个好主意(将信息和调试消息混入正常输出中可能会造成混淆!),但可行,因为您可以有多个处理程序对象和每个对象的自定义过滤器,以便选择日志记录每个处理程序要处理的内容。

  • 我正在从事一个Spring Hibernate项目,其中包含Spring AMQP RabbitMQ消息传递实现。rabbitmq配置位于一个单独的xml中,该xml被导入到根应用程序上下文中。rabbitmq侦听器接收器每秒轮询一次队列。重要的日志消息被大量的调试级轮询消息隐藏在日志文件中。 有没有办法将轮询日志分离到另一个文件中,或者阻止它污染日志? 我使用log4j进行日志记录;配置如下。

  • 我将使用Zipkin在现有代码中添加Spring Cloud Sleuth,以收集跟踪信息,并最终记录任意消息。正常的请求跨度被正确地发送到Zipkin: 检查Zipkin中的跟踪,可以正确地找到span,但是却看不到行中使用的消息--这表明我在这里做了一些错误的事情,或者它不应该以这种方式工作。我的抽样百分比设置为100%。 使用slf4j接口会很方便,因为现有的代码已经以这种方式检测了。有可能

  • 问题内容: 我需要向程序中运行的每个线程发送信息,并且每个线程都必须处理该信息。 我无法使用常规队列来执行此操作,因为那样一来,一旦一个线程从队列中删除了数据,所有其他线程将无法再看到它。 实现此目标的最佳方法是什么? 问题答案: 一种方法是在 每个 线程中都有一个队列,广播信息的功能负责将消息插入每个线程的队列中。 例如,这类似于消息队列在Windows中的工作方式。每个执行GUI操作的线程都有

  • 我刚开始使用Firebase云消息。我建了一个IOS应用来接收推送通知。应用程序运行良好。我从Firebase控制台发送消息,它们会正确显示。 我的问题是:我可以向所有设备发送一条消息吗(就像我可以在控制台中做的那样)?我是的,怎么会这样? 提前道谢!