Django 记录请求

Posted

技术标签:

【中文标题】Django 记录请求【英文标题】:Django logging requests 【发布时间】:2018-02-08 21:49:51 【问题描述】:

我在aws elastic beanstalk 中使用 django 1.11,我一直试图让我的应用程序登录但没有运气。 . .

我的 settings.py 中有这些

LOGGING_CONFIG = None
LOGGING = 
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': 
        'file': 
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/opt/python/current/app/staging.log',
        ,
    ,
    'loggers': 
        '': 
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        ,
        'django': 
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        ,
        'django.request': 
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        ,
    ,

import logging.config
logging.config.dictConfig(LOGGING)

然后我尝试调用我的一个 API,并期望日志中会显示一些内容,但它没有。我 django.request 记录器应该自动记录所有传入的请求,还是我必须创建一个可以执行 logger.debug('something') 的中间件?

登录 django 比我想象的要复杂得多:(

【问题讨论】:

【参考方案1】:

Django 记录器扩展在开发和生产中的工作方式不同(settings.DEBUG=True|False)。

您希望看到的 - http 请求日志 - 由 django.server 记录器编写, 仅在开发服务器中有效(runserver 命令)。

我看到在你的配置中你使用了 django.request 记录器。这个记录器名称非常令人困惑 - 因为正如其名称所暗示的那样 - 用户希望它记录所有 http 请求 - 但它不会。

django.request 将仅记录 4xx 和 5xx 请求。

我发了screencast 详细解释了这个问题。

Django documentation about loggers.

【讨论】:

Fiefox 出于安全原因不允许打开 screencas 链接,即证书不受信任。 django.request 记录器的 Django 文档没有提到它只记录 4xx 和 5xx 的事实让我大吃一惊。感谢您指出这一点。【参考方案2】:

django登录demo,log在/path/to/your/project/log/info.log, 您需要先在 log/ 目录中创建 info.log。

settings.py

LOG_PATH = os.path.join(BASE_DIR, "log/")
LOGGING = 
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': 
        'standard': 
            'format': '%(asctime)s [%(levelname)s]- %(message)s'

    ,
    'handlers': 
        'django_error': 
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': LOG_PATH + 'django.log',
            'formatter': 'standard'
        ,
        'info': 
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': LOG_PATH + 'info.log',
            'formatter': 'standard'
        ,
        'console': 
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'standard'
        
    ,
    'loggers': 
        'info': 
            'handlers': ['info', "console"],
            'level': 'DEBUG',
            'propagate': True
        ,
        'django': 
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': True,
        ,
        'django.request': 
            'handlers': ['django_error', 'console'],
            'level': 'DEBUG',
            'propagate': True,
        ,
        'django.db.backends': 
            'handlers': ['console'],
            'level': 'ERROR',
            'propagate': True,
        
    ,

记录器的作用是:

信息:您的自定义调试信息 django:请求记录 django.request:错误请求 django.db.backends:消息 关于代码与数据库的交互

更多信息here

views.py

import logging
logger = logging.getLogger("info")
logger.info('something')

你会得到

2017-08-31 13:05:40,492 [INFO]- something

稍后在 log/info.log 中。

【讨论】:

以上是关于Django 记录请求的主要内容,如果未能解决你的问题,请参考以下文章

Django 记录请求

在发送新的 GET 请求之前删除请求记录 Django

django 日志记录为每个请求全局设置上下文?

如何记录每个请求的 Django 应用程序的内存使用情况

使用 django-taggits 过滤带有 AND 请求的记录

将 django 请求日志保存在文件中