在 Django 和 Gunicorn 中登录时出错

Jun*_*Kim 8 python django logging

我想在出现错误时登录 Django 和 Gunicorn。我用 Python 学习 TDD,http://chimera.labs.oreilly.com/books/1234000000754/ch17.html#_setting_up_logging

这是我的代码。/etc/init/gunicorn-superlists-staging.mysite.com.conf

description "Gunicorn server for superlists-staging.mysite.com"

start on net-device-up
stop on shutdown

respawn

setuid junsu
chdir /home/junsu/sites/superlists-staging.mysite.com/source

exec ../virtualenv/bin/gunicorn \
    --bind unix:/tmp/superlists-staging.mysite.com.socket \
    --access-logfile ../access.log \
    --error-logfile ../error.log \
    superlists.wsgi:application
Run Code Online (Sandbox Code Playgroud)

帐户/身份验证.py

import requests
import logging
from django.contrib.auth import get_user_model
User = get_user_model()

PERSONA_VERIFY_URL = 'https://verifier.login.persona.org/verify'
DOMAIN = 'localhost'

class PersonaAuthenticationBackend(object):

    def authenticate(self, assertion):
        logging.warning('authenticate function')
        response = requests.post(
            PERSONA_VERIFY_URL,
            data={'assertion': assertion, 'audience': settings.DOMAIN}
        )
        logging.warning('got response form persona')
        logging.warning(response.content.decode())
        if response.ok and response.json()['status'] == 'okay':
            email = response.json()['email']
            try:
                return User.objects.get(email=email)
            except User.DoesNotExist:
                return User.objects.create(email=email)

    def get_user(self, email):
        try:
            return User.objects.get(email=email)
        except User.DoesNotExist:
            return None
Run Code Online (Sandbox Code Playgroud)

超级列表/settings.py

[....]
LOGGING = {
    'version': 1,
    'disable_existing_logger': False,
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
        },
    },
    'root': {'level': 'INFO'},
}
Run Code Online (Sandbox Code Playgroud)

我的“error.log”只是记录这个。

[2016-02-08 14:42:56 +0900] [3355] [INFO] Listening at: unix:/tmp/superlists-staging.mysite.com.socket (3355)
[2016-02-08 14:42:56 +0900] [3355] [INFO] Using worker: sync
[2016-02-08 14:42:56 +0900] [3359] [INFO] Booting worker with pid: 3359
[2016-02-08 14:58:22 +0900] [3355] [INFO] Handling signal: term
[2016-02-08 14:58:22 +0900] [3355] [INFO] Shutting down: Master
[2016-02-08 14:58:22 +0900] [3470] [INFO] Starting gunicorn 19.4.3
[2016-02-08 14:58:22 +0900] [3470] [INFO] Listening at: unix:/tmp/superlists-staging.mysite.com.socket (3470)
[2016-02-08 14:58:22 +0900] [3470] [INFO] Using worker: sync
[2016-02-08 14:58:22 +0900] [3474] [INFO] Booting worker with pid: 3474
Run Code Online (Sandbox Code Playgroud)

我想查看错误日志,我该怎么办?

Sum*_*ara 7

对于那些 为(nginx + gunicorn + django)设置搜索错误日志的人:

只需使用这些(一些命令也特定于您的套接字文件所在的位置)

  • 通过键入以下内容检查 Nginx 进程日志: sudo journalctl -u nginx
  • 通过键入以下内容检查 Nginx 访问日志: sudo less /var/log/nginx/access.log
  • 通过键入以下内容检查 Nginx 错误日志: sudo less /var/log/nginx/error.log
  • 通过键入以下内容检查Gunicorn 应用程序日志:sudo journalctl -u gunicorn
  • 通过键入以下内容检查 Gunicorn 套接字日志: sudo journalctl -u gunicorn.socket

参考


tut*_*uju 3

tl;dr 你的代码没有任何问题

看来您已正确遵循链接的教程,并且可能会在目录中找到您的日志文件/home/junsu/sites/superlists-staging.mysite.com/

无论如何,您的问题中有几点需要解决,我会尽力做到这一点。

记录器和处理程序

您上面引用的设置模块设置了一个日志记录处理程序consoleStreamHandler),以及一个django可以使用该处理程序的记录器。

记录root器没有定义任何处理程序,“django”会将任何内容记录到stderr,并且仅适用于 INFO 及以上级别。我进行了快速测试,root记录器也有一个StreamHandler默认定义的。

您的authentication.py模块当前调用logging.warning哪些日志记录器root即它确实如此logger = logging.getLogger(); logger.warning('stuff'))。但是,您可能想要定义更具体的处理程序以更轻松地找到模块的日志。参考教程的本节对此进行了解释。

Gunicorn 默认重定向 stderr

默认情况下似乎设置为捕获stderr,您当前将其重定向到日志文件。但是,我的建议是使用您的守护进程应用程序(似乎您正在使用upstart)来记录 stderr/out。

伐木新贵

正如Gunicorn 文档中所解释的,配置upstart非常简单。

如果您在配置中删除该--error-logfile选项/etc/init/gunicorn-superlists-staging.mysite.com.conf,gunicorn 将默认记录其输出,stderr然后 upstart 可以以您喜欢的任何方式捕获它。

如果您使用的是 upstart 1.7 或更高版本,则默认情况下应启用 stdout/err 捕获但是,如果您使用早期版本的 upstart,我的建议是在您的配置中添加一个console log选项,并且所有输出(stdout/stderr)将简单地记录到(我假设)/var/log/upstart/gunicorn-superlists-staging.mysite.com.log