【问题标题】:Django not logging anything levels less than WARNINGDjango没有记录任何低于警告的级别
【发布时间】:2020-12-18 19:08:52
【问题描述】:

我不确定为什么 django 没有记录低于“警告”级别的任何内容。我在视图中有这段代码:

logger = logging.getLogger(__name__)

def profile_data(request):
    logging.info("INFO PROFILE DATA!!")
    logging.debug("DEBUG PROFILE DATA!!")
    logging.warning("WARNING PROFILE DATA!!")
    logging.error("ERROR PROFILE DATA!!")

这在我的 settings.py 中:

# Logging
LOGGING = {
    'version': 1,
    # Version of logging
    'disable_existing_loggers': False,

    'filters': {
        # information regarding filters
    },

    'formatters': {
        '<simple_format>': {
            'format': '{levelname} {message}',
            'style': '{',
        }
    },

    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/logs/log_file1.log',
        },

        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler'
        },
    },

    'loggers': {
        'django': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
        'root': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        }
    }
    }

如您所见,我尝试将所有内容都设置为 DEBUG 级别,它不起作用,我只看到这是终端中的警告和错误级别:

WARNING:root:WARNING PROFILE DATA!!
ERROR:root:ERROR PROFILE DATA!!

编辑

将记录器声明更改为:

logger = logging.getLogger('app_logger')

调用:

logger.info("INFO PROFILE DATA!!")

当然还有新名称的设置:

'loggers': {
    'app_logger': {
        'handlers': ['file', 'console'],
        'level': 'DEBUG',
    },

但它仍然只打印 WARNING 及以上。我什么时候声明一个新的记录器? logging.getLogger() 不应该在设置中声明记录器吗?我应该如何在我的视图中导入该记录器?

此外,尝试按照下面的答案 ('app_logger': {"level": "DEBUG", "handler": "console"},) 的建议将记录器添加到 dict 键的顶层,但它不起作用。

【问题讨论】:

  • 你构建了一个 new 记录器,默认设置为Warning
  • “尝试按照以下答案的建议将记录器添加到 dict 键的顶层” - 我不建议这样做。我说过,要配置 root logger,您必须使用 dictConfig 顶层的“root”键。它不适用于任何记录器,仅适用于根记录器。嗯,好的,我会澄清一下 - 我看不是很清楚。

标签: django python-logging django-logging


【解决方案1】:

您构建了一个新的记录器:

logger = logging.getLogger(<b>__name__</b>)

__name__ has value [geeksforgeeks.org]:

如果源文件作为主程序执行,解释器将 __name__ 变量设置为 "__main__"。如果此文件是从另一个模块导入的,__name__ 将设置为模块的名称

因此,您将构建一个名称为__main__ 的记录器,或者一个带有模块名称的记录器。但这些不是您在settings.py 中定义的记录器,这是一个 记录器。

另一个问题是:你不使用记录器,你使用logging,所以“根”记录器,你应该替换:

    <s>logging</s>.info('INFO PROFILE DATA!!')

与:

    <b>logger</b>.info('INFO PROFILE DATA!!')

例如,我们可以使用 root 记录器:

import logging

logger = logging.getLogger('root')

def profile_data(request):
    logger.info('INFO PROFILE DATA!!')
    logger.debug('DEBUG PROFILE DATA!!')
    logger.warning('WARNING PROFILE DATA!!')
    logger.error('ERROR PROFILE DATA!!')

【讨论】:

  • 新记录器应该转到根记录器,他确实为此设置了配置。所以即使在使用 logging.info() 的情况下,它也应该记录它。
  • @Melvyn: 但根记录器不是'root',而是None。您可以使用logging.getLogger(None) 获取根记录器,或者将其留空 (logging.getLogger()。)
  • @Melvyn:这就是为什么使用root 作为记录器的名称是“自找麻烦”。您还可以在 Django 设置中指定一个使用None 作为键的记录器,然后您正在更改根记录器,但是以'root' 为名称的记录器不是“根记录器”,它只是一个自定义记录器碰巧'root'作为名字。
  • @Melvyn:以l = logging.getLogger('root')l2 = logging.getLogger(None) 为例,那么l.level 将返回10l2.level 将返回30。
  • 其实不是None,而是'root' at the top level。但是,未配置的名称仍然进入根目录。所以问题是他的“root”记录器在记录器配置中,而不是顶层的“root”键。我不得不查一下,因为我一直忘记:(
【解决方案2】:

所以下面的配置:

LOGGING = {
    "version": 1,
    "root": {"level": "DEBUG", "handlers": ["console"]},
    "loggers": {"oldname": {"level": "WARNING", "handlers": ["console"],}},
    "handlers": {
        "console": {"class": "logging.StreamHandler", "stream": "ext://sys.stdout"}
    },
}

产量:

IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import logging

In [2]: logging.warning("open stdout")
WARNING:root:open stdout

In [3]: root = logging.getLogger(None)

In [4]: old = logging.getLogger("oldname")

In [5]: new = logging.getLogger("newname")

In [6]: print(root.level, old.level, new.level)
10 30 0

In [7]: root.debug("test")
DEBUG:root:test

In [8]: old.debug("test")

In [9]: new.debug("test")
DEBUG:newname:test

因此,将您的“root”键从“loggers”内部移动到 LOGGING 字典的顶层,可以解决您的问题。

注意:顶级名称“root”是一个保留名称,用于配置root logger,可以是任何其他名称的键在顶层是行不通的。而且由于未定义的记录器从根目录继承设置,因此您的未定义记录器将起作用。

使用定义的记录器

还有其他东西干扰了您的配置。将你的配置减少到只有这个,然后开始一个一个地添加东西,直到它坏了。

LOGGING = {
    "version": 1,
    "loggers": {"app_logger": {"level": "DEBUG", "handlers": ["console",]}},
    "handlers": {"console": {"class": "logging.StreamHandler",}},
}

此外,它存在于 django 项目的 settings.py 中,并且仅适用于通过 python manage.py shell 打开 Django shell 的情况。仅在标准解释器中使用它不会加载配置(只是为了涵盖基础知识)。

【讨论】:

  • 感谢您的回答!添加了带有额外信息的编辑。试过了,但没有用。
  • 感谢您的回答和 cmets!他们帮助发现这是问题的根源:django_heroku.settings(locals())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 2014-09-16
  • 2019-02-10
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多