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

Django Celery记录最佳做法

解柏
2023-03-14
问题内容

我正在尝试让Celery日志记录与一起使用Django。我已经登录设置settings.py进入控制台(在上托管时效果很好Heroku)。在每个模块的顶部,我有:

import logging
logger = logging.getLogger(__name__)

在我的task.py中,我有:

from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)

这对于记录来自任务的调用非常有效,并且我得到如下输出:

2019-11-13T18:05:38+00:00 app[worker.1]: [2019-11-13 18:05:38,527: INFO/PoolWorker-2] Syc feed is starting

但是,如果那个任务然后在另一个模块中调用一个方法,例如一个queryset方法,我将得到重复的日志条目,例如

2019-11-13T18:00:51+00:00 app[worker.1]: [INFO] utils.generic_importers.ftp_processor process(): File xxx.csv already imported. Not downloaded
2019-11-13T18:00:51+00:00 app[worker.1]: [2019-11-13 18:00:51,736: INFO/PoolWorker-6] File xxx.csv already imported. Not downloaded

我想我可以用

CELERY_HIJACK_ROOT_LOGGER = False

只是使用Django日志记录,但是当我尝试使用它时却无法正常工作,即使我确实可以使用它,我也会失去"PoolWorker-6"我想要的东西。(顺便说一句,我无法弄清楚如何从Celery中获取要显示在日志条目中的任务名称,因为文档似乎表明应该如此)。

我怀疑这里缺少一些简单的东西。


问题答案:

当您的记录器在“另一个模块”的开头初始化时,它会链接到另一个记录器。哪个处理您的消息。它可以是root logger,或者通常我在Django项目中看到-名称为logger ''

最好的方法是覆盖您的日志记录配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'simple': {
            'format': '%(levelname)s %(message)s',
             'datefmt': '%y %b %d, %H:%M:%S',
            },
        },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'celery': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'celery.log',
            'formatter': 'simple',
            'maxBytes': 1024 * 1024 * 100,  # 100 mb
        },
    },
    'loggers': {
        'celery': {
            'handlers': ['celery', 'console'],
            'level': 'DEBUG',
        },
    }
}

from logging.config import dictConfig
dictConfig(LOGGING)

在这种情况下,我想它应该按照您的假设工作。

PS dictConfig已在Python2.7 +中添加。



 类似资料:
  • 问题内容: 我决定将日志记录系统添加到我的gwt服务层。首先,我想记录从该层引发的所有异常。我有一个类似于Spring的ServletDispatcher的对象,该对象调用其他服务。我以为可以在其中添加日志记录,但是我意识到GWT服务将已检查的异常包装在ServletResponse中,并将未检查的包装为UnexpectedException。 有人可以分享他在这个问题上的经验吗?记录所有GWT服

  • 问题内容: 在我一直在构建的应用程序中,我们相当依赖于SharedPreferences,这使我思考了访问SharedPreferences时的最佳实践。例如,许多人说通过此调用可以访问它: 但是,这似乎很危险。如果您有依赖于SharedPreferences的大型应用程序,则可能会有密钥重复,尤其是在使用某些也依赖SharedPreferences的第三方库的情况下。在我看来,更好的使用方法是:

  • 问题内容: 当前,正在讨论具有单个sql连接体系结构的优缺点。 为了详细说明我们正在讨论的是,在应用程序创建时打开一个sql连接,在应用程序关闭或错误关闭该sql连接时。根本不创建另一个连接,而只使用那个与数据库进行通信。 我们想知道社区的想法。 问题答案: 一旦您在不确定的时间内不再需要连接,请立即将其关闭。这样,连接将返回到连接池(如果启用了连接池),并且可以被其他人(重新使用)。 (连接是昂

  • 问题内容: 在研究JSON与XML的问题时,我遇到了这个问题。现在,选择JSON的原因之一是Java的易于转换,即使用。现在,从安全角度来看,这立即使我感到潜在的问题。 因此,我开始对JSON的安全性方面进行研究,并在此博客文章中就JSON的安全性不如人们认为的那样进行了研究。这部分突出: 更新: 如果您正确地执行JSON 100%,那么您只会在顶层拥有对象。数组,字符串,数字等都将被包装。然后,

  • 问题内容: 对于我的Web应用程序(PHP / MYSQL),我显示了一个项目列表,并在每行显示一个链接以删除该项目。现在,链接是 如果我想改用POST …我该怎么做(这是一个动态生成的列表)?我可以不使用表格发送POST数据吗? 或者,对于每个项目,我都要做: 并设置提交按钮的样式使其看起来像原始链接? 我不熟悉php CURL或REST,它们会帮助解决这个问题吗? 问题答案: 通常,让GET请

  • 问题内容: 多线程Java应用程序中进行进程间通信的最佳方法是什么? 它应该是高性能的(因此请不要使用JMS),易于实现且可靠,以便对象和数据只能绑定到一个线程? 任何想法欢迎! 问题答案: 假设场景1是JVM,那么实际上应该是多个线程,尤其是各种Queue实现,都是java.util.concurrent。但是,在此之上的抽象可能很好,Jetlang看起来非常有趣,轻量级的Java消息传递。