【问题标题】:Logging and email not working for Django for 500日志记录和电子邮件不适用于 Django 500
【发布时间】:2016-11-03 00:43:28
【问题描述】:

我无法在我的 Django Web 应用程序中进行日志记录。

我的设置文件如下所示:

EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 465
EMAIL_HOST_USER = "paulhtremblay@gmail.com"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = "paulhtremblay@gmail.com"
SERVER_EMAIL = 'smtp.gmail.com'

ADMINS = (
      ('Paul Tremblay', 'paulhtremblay@gmail.com'),
      )

 LOGGING = { 
'version': 1,
'disable_existing_loggers': False,
'handlers': {
    'file': {
        'level': 'ERROR',
        'class': 'logging.FileHandler',
        'filename': '/var/log/django_logs/debug.log'
    },
    'mail_admins': {
     'level': 'ERROR',
       'class': 'django.utils.log.AdminEmailHandler'
               },
},  
'loggers': {
    'django': {
    'handlers': ['file'],
    'level': 'ERROR',
    'propagate': True,
    },
    'django.request': {
    'handlers': ['file'],
    'level': 'ERROR',
    'propagate': True,
    },
},  
 }

我的视图文件中有这个:

 def five_hundred_test(request):
   raise ValueError("raising this on purpose for testing for 500")
   return render(request, 'my_test/basic_css.html')

当我将浏览器指向此功能时,我收到 500 错误(如预期的那样),但没有任何内容发送到我的电子邮件,也没有任何内容放入日志文件中。我正在使用带有 python3 的 Django 1.9,使用 Apache 来运行服务器。

【问题讨论】:

  • 如果您正确粘贴代码,LOGGING = { 之前的空格太多。在任何情况下,您都应该始终从控制台添加错误回溯。
  • 我一定没有正确粘贴。我还看到“记录”之前有太多空间。但是,代码不会引发任何错误(所以我不能包含跟踪)。它只是没有做它应该做的事情。
  • 您的环境变量有错误:SERVER_EMAIL 收到一个电子邮件地址。我会相应地更新我的答案。

标签: python django email


【解决方案1】:

这是我的工作设置。我没有添加console logger,因为我只在生产中使用它。灵感来自 Django 文档的相关Logging Examples

这是我的电子邮件和日志设置,这里是相关django docs for the email backend的链接:

from os.path import join

# Email Configuration ==========================================================
ADMINS = [('Me', 'my@email'), ]
MANAGERS = ADMINS
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
DEFAULT_FROM_EMAIL = 'My Name To Display <my@email>'
SERVER_EMAIL = 'error_from@email'
EMAIL_HOST = 'smtp.server'  # An IP may work better
EMAIL_HOST_USER = 'username_for_login'
EMAIL_HOST_PASSWORD = 'password_for_login'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

# Logging Configuration ========================================================
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': join(HOME_DIR, 'my_logs', 'debug.log'),
            'formatter': 'verbose'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'formatter': 'simple'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'ERROR',
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}

我发现您的环境变量有两个错误:

  • SERVER_EMAIL 设置必须是电子邮件地址。
  • 您使用的是TLS,因此正确的端口应该是587。

此外,您正在尝试将 Google 用作 SMTP 服务器,但根据updated answer,此服务不再可从 google 获得,您必须搜索另一个 SMTP 服务器。

如果您需要使用,我还有assembled a post 提供了一些调试技术。

【讨论】:

    【解决方案2】:

    这可以更简单地完成。如果您想同时登录到电子邮件和 Apache 日志文件,您需要在 settings.py 中执行以下操作:

    1. 配置电子邮件设置 - 这确保 Django 可以发送电子邮件

       SERVER_EMAIL = 'me@me.eu'
      
       EMAIL_HOST = 'smtp.me.eu'
       EMAIL_PORT = 587
       EMAIL_USE_TLS = True
       EMAIL_HOST_USER = SERVER_EMAIL
       EMAIL_HOST_PASSWORD = 'password'
      
    2. DEBUG 设置为False - 这会启用错误电子邮件发送

       DEBUG = False
      
    3. 将错误电子邮件接收者添加到ADMINS(您可能也需要MANAGERS) - 这指定谁接收错误电子邮件

       ADMINS = (
         ('Me', 'me@me.eu'),
       )
      
       MANAGERS = ADMINS
      
    4. 最后,删除在禁用调试模式时不允许消息通过的默认控制台过滤器 - 这会使错误最终出现在 Apache 错误日志中

       from django.utils.log import DEFAULT_LOGGING
      
       # Assure that errors end up to Apache error logs via console output
       # when debug mode is disabled
       DEFAULT_LOGGING['handlers']['console']['filters'] = []
      

      这必须在settings.py 中,因为在导入设置后将立即使用DEFAULT_LOGGING 配置日志记录。

    如果您想添加对从您自己的代码进行日志记录的支持,请同时在 settings.py 中配置根记录器:

    # Enable logging to console from our modules by configuring the root logger
    DEFAULT_LOGGING['loggers'][''] = {
        'handlers': ['console'],
        'level': 'INFO',
        'propagate': True
    }
    

    最后,您可能想要打开详细日志记录:

    # Detailed log formatter
    DEFAULT_LOGGING['formatters']['detailed'] = {
        'format': '{levelname} {asctime} {pathname}:{funcName}:{lineno} {message}',
        'style': '{',
    }
    DEFAULT_LOGGING['handlers']['console']['formatter'] = 'detailed'
    

    然后您可以按如下方式使用它:

    log = logging.getLogger(__name__)
    log.info('Logging works!')
    

    【讨论】:

      【解决方案3】:

      还要检查您的电子邮件客户端规则,了解电子邮件到达后如何处理。

      我的电子邮件客户端中有一些规则有错误,它们正在阻止我的 Django 记录邮件进入/显示。

      【讨论】:

        猜你喜欢
        • 2018-07-27
        • 2017-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-12
        • 2011-09-12
        • 1970-01-01
        相关资源
        最近更新 更多