为什么忽略了我的Django settings.py中的日志记录?

时间:2018-10-26 18:29:46

标签: python django

我正在尝试在Django 2.1应用中设置日志记录,但无法显示INFO日志。显示错误和警告,但不显示信息。

我在我的settings.py中添加了一个自定义的LOGGING设置,但它似乎并不影响实际的日志记录。我尝试过更改级别,更改格式程序,打开disable_existing_loggers。我敢肯定,Django只会忽略LOGGING,但是https://docs.djangoproject.com/en/2.1/topics/logging/#configuring-logging以及我所看到的所有地方似乎都表示相反。

做什么?!

详细信息:

我正在用Hericorn在Heroku中运行它,但也通过python manage.py runserver运行,其作用相同。

在我的./api/v1/serializers.py和./users/models.py中,我添加了这样的日志记录:

import logging
logger = logging.getLogger(__name__)
...
...
...
logger.info('Test log INFO')
logger.warning('Test log WARNING')
logger.error('Test log ERROR')

我的设置位于./amp/settings.py,并具有以下内容:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d: %(message)s',
        },
        'simple': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'INFO',
            'formatter': 'verbose',
            'filters': [],
        },
        'file': {
            'class': 'logging.FileHandler',
            'level': 'DEBUG',
            'filename': '/tmp/amp-server/debug.log',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        '': {
            'level': 'INFO',
            'propagate': True,
            'handlers': ['console', 'file'],
            'filters': [],
        },
        'django.request': {
            'level': 'DEBUG',
            'propagate': False,
            'handlers': ['console'],
        },
    },
}

没有其他地方引用settings.py的日志记录。我尝试添加以我的项目和应用(amp,amp.api,api等)命名的显式记录器,但无济于事:

        'amp': {
            'level': 'INFO',
            'propagate': True,
            'handlers': ['console', 'file'],
            'filters': [],
        },

以及后来的logger = logging.getLogger('amp'),但这没有什么区别。我相当确定Django会忽略我的settings.py LOGGING或将其覆盖。 (在您询问之前,LOGGING在我的代码库中没有引用,而是在settings.py中引用。)

我已经仔细地梳理了Django LOGGING和Python dictConfig文档,博客和StackOverflow帖子中的复制粘贴和调整的LOGGING设置,但没有任何帮助!

注意:这不是Why Django logging skips log entries?的重复-这些答案试图修复损坏的LOGGING值,而不是处理根本没有使用LOGGING的事实。 logging.basicConfig可以更改日志记录设置,但是常规的LOGGING配置在我的settings.py中仍然被忽略。

2 个答案:

答案 0 :(得分:1)

因此,看来Django在settings.py中对LOGGING并没有执行任何操作……您必须自己手动注册LOGGING配置。

AFAICT,这不是应该的样子,但是现实与文档不符。这是我所做的工作:

# To prevent Django from configuring logging itself
LOGGING_CONFIG = None
LOGGING = {
    ...
}
import logging.config
logging.config.dictConfig(LOGGING)

如果有人知道情况如何或为什么在任何地方都没有提及,我会很感兴趣!

答案 1 :(得分:0)

发现此解决方案很有帮助

LOGGING_CONFIG = None

Logging{...}

import logging.config
logging.config.dictConfig(Logging)

确保遵循语句顺序

来源-https://docs.djangoproject.com/en/3.0/topics/logging/#disabling-logging-configuration