1

我不确定为什么 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()在设置中声明记录器?我应该如何在我的视图中导入该记录器?

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

4

2 回答 2

1

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

logger = logging.getLogger(__name__)

__name__有价值 [geeksforgeeks.org]

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

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

另一个问题是:您不使用记录器,而是使用logging“根”记录器,因此应该替换:

    logging.info('INFO PROFILE DATA!!')

和:

    logger.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!!')
于 2020-12-18T19:30:04.510 回答
1

所以下面的配置:

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

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

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

使用定义的记录器

还有其他东西干扰了您的配置。将您的配置减少到仅此,然后开始一一添加内容,直到它中断。

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

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

于 2020-12-18T20:58:57.793 回答