Django Django的错误日志记录

71 阅读2分钟

我正在使用 Django + Python + Gunicorn + Nginx + MySQL 技术栈创建一个社交交友网站:www.tomonotomo.com

我的 Django 中的 settings.py 文件如下:

DEBUG = False
TEMPLATE_DEBUG = False

ADMINS = (
    ('Pratik Poddar', 'xxxxxxxxxxx'),
)

MANAGERS = ADMINS

FAILED_RUNS_CRONJOB_EMAIL_PREFIX = "[Django - Tomonotomo - Cron Job] "
EMAIL_SUBJECT_PREFIX = "[Django - Tomonotomo] "

.....
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
         }
     },
     'formatters': {
       'verbose': {
        'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        }
      },
      'handlers': {
           'null': {
          'level': 'INFO',
          'class': 'logging.NullHandler'
       },

           'mail_admins': {
              'level': 'ERROR',
              'class': 'django.utils.log.AdminEmailHandler'
           }
      },
     'loggers': {
           'django': {
          'handlers': ['null'],
          'level': 'INFO',
          'propagate': True,
        },
            'django.request': {
               'handlers': ['mail_admins'],
               'level': 'ERROR',
               'propagate': True,
            },
      }
 }

我的 gunicorn 配置(编辑:supervisor 配置)如下:

stdout_logfile = /home/ubuntu/gunicorn_tomonotomo_supervisor.log
redirect_stderr = true                      

我的 nginx 配置有:

 access_log /home/ubuntu/tomonotomo-access.log;
 error_log /home/ubuntu/tomonotomo-error.log error;

我无法看到我的错误日志。我不想将 debug 设置为 True,因为它在生产中。我也没有收到任何邮件。

我希望所有日志都保存在一个文件中,并每天早上将所有错误通过电子邮件发送给我。我怎样才能实现这一点?非常感谢。

解决方法

  1. 将 DEBUG 设置为 False,将 TEMPLATE_DEBUG 设置为 False,以禁用 Django 的调试功能。

  2. 在 LOGGING 配置中,添加一个新的处理程序,将日志级别设置为 INFO,并将其类设置为 logging.FileHandler。将此处理程序添加到 djangodjango.request 日志记录器的处理程序列表中。

  3. 在 LOGGING 配置中,添加一个新的格式器,将格式设置为 %(asctime)s - %(levelname)s - %(message)s。将此格式器添加到 file 处理程序的格式器列表中。

  4. 在 gunicorn 配置中,将 --log-file 参数设置为日志文件的路径。

  5. 在 nginx 配置中,将 error_log 参数设置为日志文件的路径。

以下是更新后的 LOGGING 配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
         }
     },
     'formatters': {
       'verbose': {
        'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
       'simple': {
            'format': '%(asctime)s - %(levelname)s - %(message)s'
        }
      },
      'handlers': {
           'null': {
          'level': 'INFO',
          'class': 'logging.NullHandler'
       },

           'file': {
               'level': 'INFO',
               'class': 'logging.FileHandler',
               'filename': '/home/ubuntu/tomonotomo.log',
               'formatter': 'simple'
           },

           'mail_admins': {
              'level': 'ERROR',
              'class': 'django.utils.log.AdminEmailHandler'
           }
      },
     'loggers': {
           'django': {
          'handlers': ['file'],
          'level': 'INFO',
          'propagate': True,
        },
            'django.request': {
               'handlers': ['mail_admins'],
               'level': 'ERROR',
               'propagate': True,
            },
      }
 }

以下是更新后的 gunicorn 配置:

stdout_logfile = /home/ubuntu/gunicorn_tomonotomo_supervisor.log
redirect_stderr = true
log_file = /home/ubuntu/gunicorn_tomonotomo_supervisor.log                      

以下是更新后的 nginx 配置:

 access_log /home/ubuntu/tomonotomo-access.log;
 error_log /home/ubuntu/tomonotomo-error.log;

现在,所有日志都将保存在 /home/ubuntu/tomonotomo.log 文件中,所有错误都将通过电子邮件发送给管理员。