【问题标题】:Django: Setting LOGGER doesn't workDjango:设置 LOGGER 不起作用
【发布时间】:2016-10-10 13:18:58
【问题描述】:

我在使用 Django 的日志记录系统时遇到了问题。我的目标是将所有类型的日志记录到文件中,并且仅在 DEBUG 设置为 True 时才记录到控制台(现在就是这样)

事实上,日志文件保持空白(尽管它们是由 Django 创建的)。当我启动服务器(使用python3 manage.py runserver)时,我在 shell 中看到以下内容:

Warning!
Error!

... (normal server stuff)

但没有任何内容写入任何日志文件。

如果我在 __init__.py 中取消注释 logging.error('== == START LOGGER == ==')logr.setLevel('DEBUG'),那么 shell 会显示:

ERROR:root:== == START LOGGER == ==
DEBUG:project:Debug!
INFO:project:Info!
WARNING:project:Warning!
ERROR:project:Error!

... (normal server stuff)

django.log 显示:

DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
DEBUG (0.001) SHOW FULL TABLES; args=None
DEBUG (0.000) SELECT `django_migrations`.`app`, `django_migrations`.`name` FROM `django_migrations`; args=()

但所有其他日志保持空白。

这是我的项目应用程序

__init__.py

import logging

#logging.error('== == START LOGGER == ==')
logr = logging.getLogger('project')
#logr.setLevel('DEBUG')

logr.debug('Debug!')
logr.info('Info!')
logr.warning('Warning!')
logr.error('Error!')

这是我的日志设置

settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
        'simpler': {
            'format': '%(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'default':{
            'level': 'WARNING',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/err.log',
            'maxBytes': 5242880, # 5MB file size
            'encoding': 'utf-8',
            'backupCount': 5,
            'formatter': 'simple',
        },
        'debug':{
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/debug.log',
            'maxBytes': 5242880, # 5MB file size
            'encoding': 'utf-8',
            'backupCount': 5,
            'formatter': 'simple',
        },
        'django':{
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/django.log',
            'maxBytes': 5242880, # 5MB file size
            'encoding': 'utf-8',
            'backupCount': 5,
            'formatter': 'simple',
        },
        'mail':{
            'level': 'WARNING',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/mail.log',
            'maxBytes': 5242880, # 5MB file size
            'encoding': 'utf-8',
            'backupCount': 5,
            'formatter': 'simple',
        },
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simpler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['django'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'django.db.backends': {
            'handlers': ['django'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'django.request': {
            'handlers': ['mail'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'project': {
            'handlers': ['default', 'debug', 'console'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}

为什么我写logging.error('== == START LOGGER == ==')logr.setLevel('DEBUG')时会显示DEBUGINFO??为什么不写入日志文件?我已经搜索了几个小时的类似问题及其答案,但没有成功。谢谢。

编辑:我尝试过的事情:

'disable_existing_loggers' 更改为False

'level': 'DEBUG', 更改为'level': 'NOTSET','level': 'ERROR',

删除所有必要的设置

'propagate' 更改为True

'handlers' 中删除'console'(这完全没有任何作用)

【问题讨论】:

  • 除了一些特定于 Django 的项目之外,settings.LOGGING['loggers'] 中的唯一条目是 project。除了project,您的任何代码都在模块中吗?
  • 不,现在它是一个非常基本的 django 应用程序,只有一个模块(称为“项目”)

标签: python django debugging logging console


【解决方案1】:

我没有足够的分数来添加评论,所以我会在这里提到,如果您的日志记录格式使用%(name)s,那么对上述答案的有用扩展是,在您拥有的文件中:

logr = logging.getLogger('project')

你可以使用:

logr = logging.getLogger('project.%s' % __name__)

这意味着您的项目记录器会报告完整的应用名称,例如。 'project.polls.views'

【讨论】:

    【解决方案2】:

    您的 __init__.py 文件在 settings.py

    之前被调用

    将您的代码从 __init__.py 移动到任何其他文件,该文件将在 settings.py

    之后调用

    【讨论】:

    • 这完全正确。非常感谢!我刚刚将所有代码从 _init_.py 移动到同一文件夹中的新 main.py 中(使用名为 start 的函数),在 urls.py 中调用它: from .main import start start()`
    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2012-08-02
    • 2016-02-16
    相关资源
    最近更新 更多