5

我已将以下日志记录配置添加到我的 Django 应用程序的settings.py文件中:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
        },
    },
}

现在,我只想在 中的一个视图中添加一些自定义日志记录views.py,但似乎记录器是NOTSET,这意味着只记录了级别warning和更高级别:

import logging
from django.http import JsonResponse

logger = logging.getLogger(__name__)

def testing(request):
    logger.info("Doesn't show...")
    logger.warning(f"Log Level: {logger.level} = {logging.getLevelName(logger.level)}")
    return JsonResponse({"Hello": "World"})

上面的代码片段记录了以下内容:

Log Level: 0 = NOTSET

难道我做错了什么?为什么没有设置记录器的级别(即使我明确设置了settings.py)?

4

3 回答 3

8

为什么会有这种行为?

logging.getLogger(__name__)语句将使用当前模块的虚线路径初始化一个 python 记录器。在你的情况下,它会是my_app.views. Django 无法理解您创建的日志,views.py因为您的记录器名称my_app.views未在settings.py. 如果您没有相应地指定记录器名称/记录器名称模式, Django 不会对日志做任何事情。

日志如何warning显示?

我希望这个所以发布这个解释得很好,Python日志没有输出任何东西

解决方案

选项1

更改您的记录器名称settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'my_app.views': {
            'handlers': ['console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
        },
    },
}

关键更改:我已将记录器名称更改djangomy_app.views

选项 2

在方法中指定记录器名称getLogger

logger = logging.getLogger('django')

关键点:记录器的名称和 Django Settings 模块中定义的记录器应该相同。

于 2019-12-19T03:09:42.180 回答
2

由于您配置了记录器'django'并且您的模块(可能)不在django包中,因此您需要'django'明确获取记录器:

# logger = logging.getLogger(__name__)
logger = logging.getLogger('django')

否则,您会得到一个未配置的记录logger.levelNOTSET

但是,Django 将使用您的日志记录配置。

来自https://docs.python.org/3/library/logging.html

记录器名称层次结构类似于 Python 包层次结构,如果您使用推荐的结构按模块组织记录器,则与它相同logging.getLogger(__name__)。这是因为在一个模块中,__name__是 Python 包命名空间中的模块名称。

于 2019-12-19T02:54:30.207 回答
0

因为logging.getLogger(__name__)创建一个带有当前模块路径的 python 记录器,并且由于您没有在设置中注册此记录器,所以 Django 无法理解您从views.py. 一种解决方案是按照@JPG 之前所说的那样在您的设置中注册它。另一种解决方案是手动创建它。例如,您可以创建一个Utils.py文件并创建此函数来创建您的记录器。

import logging
def get_view_logger(view_name):
    logger = logging.getLogger(view_name)
    logger.setLevel(logging.INFO)
    handler = TimedRotatingFileHandler(os.path.join(BASE_DIR, 'log/' + view_name + '.log'),
                                       when='midnight', backupCount=20, encoding="utf8")
    formatter = logging.Formatter('%(asctime)s [%(levelname)s] : %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    return logger

您可以自定义记录器的每个组件,例如处理程序、格式化程序等。

于 2019-12-20T07:22:11.120 回答