【问题标题】:Why is LOGGING in my Django settings.py ignored?为什么我的 Django settings.py 中的 LOGGING 被忽略了?
【发布时间】:2019-03-31 13:13:46
【问题描述】:

我正在尝试在我的 Django 2.1 应用程序中设置日志记录,但无法显示 INFO 日志。 ERROR 和 WARNING 显示,但从不显示 INFO。

我在 settings.py 中添加了一个自定义的 LOGGING 集,但它似乎不会影响实际的日志记录。我尝试过更改级别、更改格式化程序、打开 disable_existing_loggers。我很确定 Django 只是忽略了 LOGGING,但 https://docs.djangoproject.com/en/2.1/topics/logging/#configuring-logging 和我所看到的任何地方似乎都表明并非如此。

做什么?!

详情:

我在 Heroku 中使用 gunicorn 运行它,但也通过 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 的 LOGGING。我尝试添加以我的项目和应用程序(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 可以更改日志记录设置,但我的 settings.py 中仍然忽略了常规 LOGGING 配置。

【问题讨论】:

  • logger = logging.getLogger('amp') 同时配置了 'amp' 日志应该可以解决问题。
  • @henriquesalvaro:谢谢你的想法。但我已经试过了。设置 'amp' 记录器并显式设置 logging.getLogger('amp') 没有任何区别。它似乎仍然通过默认配置进行管道传输,忽略 INFO 但通过 WARNING 及以上。
  • @solarissmoke:这不是stackoverflow.com/questions/36571284/… 的副本——这些答案试图修复损坏的 LOGGING 值,而不是处理根本没有使用 LOGGING 的事实。其中一个答案提到了 logging.basicConfig,它可以为我更改日志记录设置,但我的 settings.py 中仍然忽略了常规 LOGGING 配置。

标签: python django


【解决方案1】:

发现这个解决方案很有帮助

LOGGING_CONFIG = None

Logging{...}

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

确保遵循陈述的顺序

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

【讨论】:

    【解决方案2】:

    看来 Django 对settings.py 中的 LOGGING 没有做任何事情...您必须自己手动注册 LOGGING 配置。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-30
      • 2016-06-20
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 2022-12-23
      • 2015-08-17
      • 2021-08-23
      相关资源
      最近更新 更多